Python中列表(list)、字典(dict)、集合(set) 数据排序
参考链接:http://ciniao.me/article.php?id=8
对字符串列表进行就地排序
list_str = [‘blue’,’allen’,’sophia’,’keen’]
print list_str
list_str.sort()
print list_str
#执行结果:
[‘blue’, ‘allen’, ‘sophia’, ‘keen’]
[‘allen’, ‘blue’, ‘keen’, ‘sophia’]
====
对整型数进行排序
list_int = [34,23,2,2333,45]
print list_int
list_int.sort()
print list_int
#执行结果:
[34, 23, 2, 2333, 45]
[2, 23, 34, 45, 2333]
====
对字典数据进行排序(对字典进行排序需要使用sorted()方法)
dict_str = {‘blue’:’[email protected]’,
‘allen’:’[email protected]’,
‘sophia’:’[email protected]’,
‘ceen’:’[email protected]’}
print dict_str
# 按照key进行排序
print sorted(dict_str.items(), key=lambda d: d[0])
# 按照value进行排序
print sorted(dict_str.items(), key=lambda d: d[1])
#执行结果:
{‘blue’: ‘[email protected]’, ‘allen’: ‘[email protected]’, ‘sophia’: ‘[email protected]’, ‘ceen’: ‘[email protected]’}
[(‘allen’, ‘[email protected]’), (‘blue’, ‘[email protected]’), (‘ceen’, ‘[email protected]’),(‘sophia’, ‘[email protected]’)]
[(‘allen’, ‘[email protected]’), (‘sophia’, ‘[email protected]’), (‘blue’, ‘[email protected]’), (‘ceen’, ‘[email protected]’)]
====
对集合排序:
data = set([‘booklet’, ‘4 sheets’, ’48 sheets’, ’12 sheets’])
r = sorted(data, key=lambda item: (int(item.partition(‘ ‘)[0]) if item[0].isdigit() else float(‘inf’), item))
print ‘,n’.join(r)
4 sheets,
12 sheets,
48 sheets,
booklet
原文参见:http://stackoverflow.com/questions/2669059/how-to-sort-alpha-numeric-set-in-python
=========================================================
来个复杂点的例子:
对list进行排序,list的元素是一个含有三个数字的list,排序规则如下:
第一位升排序
若第一位相同,第二位降排序
若第二位也相同,第三位升排序
提示:可以用sort方法
例:
排序前
alist=[[1,2,3],[2,3,1],[1,3,2],[1,3,4],[1,2,1]]
排序后
Alist=[[1,3,2],[1,3,4],[1,2,1],[1,2,3],[2,3,1]]
代码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- alist=[[1,2,3],[2,3,1],[1,3,2],[1,3,4],[1,2,1]] Alist = sorted(alist) print Alist b = sorted(Alist,cmp = lambda x, y: -cmp(x[1], y[1])) print b c = sorted(b, key = lambda z: z[0]) print c
原文地址:
python中列表(list)、字典(dict)、集合(set) 数据排序
Python两个 list 获取交集,并集,差集的方法
1.获取两个 list 的交集
#方法一
b=[2,5,8]
tmp = [val for val in a if val in b] #生成列表
print tmp
#[2, 5]
#方法二
2.获取两个 list 的并集
3.获取两个 list 的差集
通过以上方法,就能处理 python list 的交集,并集,差集了。
Python对list去重的各种方法
直观方法
最简单的思路就是:
ids = [1,2,3,3,4,2,3,4,5,6,1] news_ids = [] for id in ids: if id not in news_ids: news_ids.append(id) print news_ids
这样也可行,但是看起来不够Pythonic。
用set
另外一个解决方案就是用set:
ids = [1,4,3,3,4,2,3,4,5,6,1] ids = list(set(ids))
这样的结果是没有保持原来的顺序。
按照索引再次排序(为了保持原来的顺序)
最后通过这种方式解决:
ids = [1,4,3,3,4,2,3,4,5,6,1] news_ids = list(set(ids)) news_ids.sort(ids.index)
使用itertools.grouby
文章一开始就提到itertools.grouby, 如果不考虑列表顺序的话可用这个:
ids = [1,4,3,3,4,2,3,4,5,6,1] ids.sort() it = itertools.groupby(ids) for k, g in it: print k
关于itertools.groupby的原理可以看这里:http://docs.python.org/2/library/itertools.html#itertools.groupby
网友补充:用reduce
网友reatlk留言给了另外的解决方案。我补充并解释到这里:
>> ids = [1,4,3,3,4,2,3,4,5,6,1] >> func = lambda x,y:x if y in x else x + [y] >> reduce(func, [[], ] + ids) Output: [1, 4, 3, 2, 5, 6]
上面是我在ipython中运行的代码,其中的 lambda x,y:x if y in x else x + [y] 等价于 lambda x,y: y in x and x or x+[y] 。
思路其实就是先把ids变为[[], 1,4,3,……] ,然后在利用reduce的特性。reduce解释参看这里:http://docs.python.org/2/library/functions.html#reduce
=================
字典(dict)
dict 用 {} 包围
dict.keys(),dict.values(),dict.items()
hash(obj)返回obj的哈希值,如果返回表示可以作为dict的key
del 或 dict.pop可以删除一个item,clear清除所有的内容
sorted(dict)可以把dict排序
dict.get()可以查找没存在的key,dict.[]不可以
dict.setdefault() 检查字典中是否含有某键。如果字典中这个键存在,你可以取到它的值。 如果所找的键在字典中不存在,你可以给这个键赋默认值并返回此值。
{}.fromkeys()创建一个dict,例如: {}.fromkeys((‘love’, ‘honor’), True) =>{‘love’: True, ‘honor’: True}
不允许一个键对应多个值
键值必须是哈希的,用hash()测试
一个对象,如果实现_hash()_方法可以作为键值使用
集合(set)
set.add(), set.update(), set.remove(),添加更新删除,-= 可以做set减法
set.discard 和 set.remove不同在于如果删除的元素不在集合内,discard不报错,remove 报错
< <= 表示 子集,> >=表示超集
| 表示联合 & 表示交集 – 表示差集 ^ 差分集
列表(list)
append(x) 在列表尾部追加单个对象x。使用多个参数会引起异常。
count(x) 返回对象x在列表中出现的次数。
extend(L) 将列表L中的表项添加到列表中。返回None。
Index(x) 返回列表中匹配对象x的第一个列表项的索引。无匹配元素时产生异常。
insert(i,x) 在索引为i的元素前插入对象x。如list.insert(0,x)在第一项前插入对象。返回None。
pop(x) 删除列表中索引为x的表项,并返回该表项的值。若未指定索引,pop返回列表最后一项。
remove(x) 删除列表中匹配对象x的第一个元素。匹配元素时产生异常。返回None。
reverse() 颠倒列表元素的顺序。
sort() 对列表排序,返回none。bisect模块可用于排序列表项的添加和删除。
元组(tuple)
tuple=1,2,3,4,这也可以是一个元组,在不使用圆括号而不会导致混淆时,Python允许不使用圆括号的元组。
元组的索引用tuple[i]的形式,而不是tuple(i)。
和列表类似,使用tuple(seq)可把其它序列类型转换成元组。
《 “Python中的列表(list),元组(tuple),集合(set),字典(dict)” 》 有 13 条评论
在Python中如何将dict转换成字符串进行处理
方法一:使用json模块
`
import json
# convert to string
input = json.dumps({‘id’: id })
# load to dict
my_dict = json.loads(input)
`
方法二:用str和eval
`
dict1 = {‘one’:1, ‘two’:2, ‘three’: {‘three.1’: 3.1, ‘three.2’: 3.2 }}
str1 = str(dict1)
dict2 = eval(str1)
print dict1 == dict2
`
方法三:针对单层dict
`
‘, ‘.join([‘ : ‘.join((k, str(keywordsList[k]))) for k in sorted(keywordsList, key=keywordsList. get, reverse=True)])
`
参考链接:
http://stackoverflow.com/questions/4547274/convert-a-python-dict-to-a-string-and-back
http://stackoverflow.com/questions/18232524/python-dict-to-string
http://www.cnblogs.com/end/archive/2012/03/30/2425977.html
http://stackoverflow.com/questions/988228/convert-a-string-representation-of-a-dictionary-to-a-dictionary
http://smilejay.com/2014/10/convert_string_to_dict_python/
Python中的 set 的使用 # http://www.jianshu.com/p/de4af954fcbe
Python集合(set)类型的操作 # http://blog.csdn.net/business122/article/details/7541486
https://docs.python.org/2/library/stdtypes.html#set
`
# 创建 set
# 创建 set 的方式是调用 set() 并传入一个 list,list的元素将作为set的元素
s = set([‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’])
# 访问set
# 由于set存储的是无序集合,所以我们没法通过索引来访问。所以,访问 set中的某个元素实际上就是判断一个元素是否在set中。
print ‘Bart’ in s
# 更新set
if name in s:
s.remove(name)
else:
s.add(name)
`
Python官方教程及其学习笔记
https://docs.python.org/2.7/tutorial/
http://forrestchang.github.io/14824095038232.html
包含常见数据结构的操作(list、set、dict)
Python中如何将一个内容实际为list的字符串转换成真正的list类型? (Convert string representation of list to list in Python)
https://stackoverflow.com/questions/1894269/convert-string-representation-of-list-to-list-in-python
https://stackoverflow.com/questions/10775894/converting-a-string-representation-of-a-list-into-an-actual-list-object
`
>>> import ast
>>> x = u'[ “A”,”B”,”C” , ” D”]’
>>> x = ast.literal_eval(x)
>>> x
[‘A’, ‘B’, ‘C’, ‘ D’]
# 或
>>> import json
>>> x = u'[ “A”,”B”,”C” , ” D”]’
>>> json.loads(x)
[u’A’, u’B’, u’C’, u’ D’]
`
Python中list,tuple,dict,set的区别和用法
https://www.cnblogs.com/soaringEveryday/p/5044007.html
`
#Python中set变量的初始化是通过给set()传递一个list类型的变量(或者不传)来实现的,不接受如下形式:
>>> s = set(‘A’, ‘B’, ‘C’) #错误
TypeError: set expected at most 1 arguments, got 3
>>> s = set([‘A’, ‘B’, ‘C’]) #正确
>>> s.add(4)
>>> print s
set([‘A’, ‘C’, ‘B’, 4])
`
Python中如何检测一个变量的类型是否为 list/dict/tuple ?
https://stackoverflow.com/questions/26544091/checking-if-type-list-in-python
`
In [144]: test_object = ‘str’
…: if isinstance(test_object, (list,)): print ‘type(test_object) is list’
…:
In [145]: type(test_object)
Out[145]: str
In [146]: test_object = []
…: if isinstance(test_object, (list,)): print ‘type(test_object) is list’
…:
type(test_object) is list
In [147]: type(test_object)
Out[147]: list
In [148]: test_object = {}
…: if isinstance(test_object, (dict,)): print ‘type(test_object) is dict’
…:
type(test_object) is dict
In [149]: type(test_object)
Out[149]: dict
In [150]: test_object = ()
…: if isinstance(test_object, (tuple,)): print ‘type(test_object) is tuple’
…:
type(test_object) is tuple
In [151]: type(test_object)
Out[151]: tuple
`
python的TypeError: unhashable type(list/set/dict)问题
http://stackoverflow.com/questions/6754102/typeerror-unhashable-type
https://blog.csdn.net/lanchunhui/article/details/50955238
https://blog.csdn.net/pyufftj/article/details/72366631
TypeError: unhashable type: ‘list’
https://blog.csdn.net/you_are_my_dream/article/details/61616646
`
Python不支持dict的key为list或dict类型,因为list和dict类型是unhashable(不可哈希)的。
Python中 list 类型的值不可哈希;创建 set 类型值时,输入不能使用包含 unhashable 类型的 list。
In [38]: s = set(range(1, 10))
In [39]: s
Out[39]: {1, 2, 3, 4, 5, 6, 7, 8, 9}
In [40]: li = range(1, 11)
In [41]: li
Out[41]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [42]: li.append(range(1, 11))
In [43]: li
Out[43]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
In [44]: s = set(li)
—————————————————————————
TypeError Traceback (most recent call last)
in ()
—-> 1 s = set(li)
TypeError: unhashable type: ‘list’
In [48]: li3 = range(1, 11)
In [49]: li3.extend(range(1, 11))
In [50]: li3
Out[50]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [51]: ss = set(li3)
In [52]: ss
Out[52]: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
`
再谈collections模块defaultdict()和namedtuple()
https://www.cnblogs.com/herbert/p/3468294.html
python模块collections中namedtuple()的理解
https://blog.csdn.net/helei001/article/details/52692128
https://docs.python.org/2/library/collections.html#collections.namedtuple
不可不知的Python模块: collections
http://www.zlovezl.cn/articles/collections-in-python/
Python中如何将一个 list 类型的元素添加到 set 中去?
https://stackoverflow.com/questions/1306631/python-add-list-to-set
`
Python中不能直接将 list 添加到 set 中,因为 list 是可变的,意味着你可以在将其添加到 set 之后改变它的内容。
但是你可以将 tuple 添加到 set 中,因为 tuple 是不可变的。
`
Python中如何向 set 添加元素?
https://stackoverflow.com/questions/3392354/append-values-to-a-set-in-python/31972583#31972583
`
a = set()
# 添加单个元素
a.add(1)
a.add(2) # {1, 2}
# 向SET中添加可迭代(iterable)类型变量包含的元素
a.update([3,4]) # {1, 2, 3, 4}
`
Python中2个SET如何合并
https://stackoverflow.com/questions/17429123/how-to-join-two-sets-in-one-line-without-using
`
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}
set_a.union(set_b) # 返回 {1, 2, 3, 4, 5, 6} 但 set_a 没变
set_a.update(set_b) # set_a 就更新了
`
Python中 SET 的初始化
Use curly braces to initialize a Set in Python
https://stackoverflow.com/questions/17373161/use-curly-braces-to-initialize-a-set-in-python
`
>>> a = set(‘aardvark’)
>>> a
{‘d’, ‘v’, ‘a’, ‘r’, ‘k’}
>>> b = {‘aardvark’} # 使用{}的方式来初始化SET
>>> b
{‘aardvark’}
`
https://docs.python.org/2/reference/expressions.html#set-displays
Python中如何在遍历一个 dict 的过程中删除部分元素?
How to delete items from a dictionary while iterating over it?
https://stackoverflow.com/questions/5384914/how-to-delete-items-from-a-dictionary-while-iterating-over-it
`
val = 3
mydict = {‘one’: 1, ‘two’: 2, ‘three’: 3, ‘four’: 4}
print mydict
# 方法一
# 将遍历删除过程分成 2 步进行
remove = [k for k in mydict if k == val]
for k in remove: del mydict[k]
# 方法二
# Python 2.7 and 3.x
mydict = { k:v for k,v in mydict.items() if k!=val }
# before Python 2.7
mydict = dict((k,v) for k,v in mydict.iteritems() if k!=val)
`