collections是Python内建的一个集合模块,提供了许多有用的集合类.
1 defaultdict
当defaultdict里面套defaultdict时,实际上实现了一个二维坐标的功能.
import collections # 普通的dict当引用的key不存在的时候会报错,而defaultdict不会,它可以给字典的值设置一个类型, # 当key不存在时可以自动生成相应类型的value。 # 如下可以直接设置为list str int dict等,这些内置类型在没有参数调用时返回空类型。 d = collections.defaultdict(list) print(d) print(d[2]) # 新建一个key后,值是一个默认的空list d[1] = 5 print(d) # defaultdict(<class 'list'>, {}) # [] # defaultdict(<class 'list'>, {2: [], 1: 5}) # defaultdict接受的参数必须是可调用的。若直接传递数字0,就会出现TyptError的异常。 # 如下设置默认值为0,不用lambda会报错,这里用lambda相当于一个没有传入值,只有返回值的函数, a = collections.defaultdict(lambda :0) print(a[1]) print(a) # 0 # defaultdict(<function <lambda> at 0x7fac3db7bea0>, {1: 0}) # defaultdict类除了接受类型名称作为初始化函数的参数之外,还可以使用任何不带参数的可调用函数, # 到时该函数的返回结果作为默认值,这样使得默认值的取值更加灵活。 def fun(): return [1,2,3] b = collections.defaultdict(fun) # 如下已经新建了一个key b[3] print(b[1]) print(b) # [1, 2, 3] # defaultdict(<function fun at 0x7fac3c0b2730>, {3: [1, 2, 3], 1: [1, 2, 3]}) # 这里规定了字典的默认值是一个字典,相当与字典套字典 c = collections.defaultdict(lambda :collections.defaultdict(list)) # 如果赋明确的数据类型,就按赋的弄,如果不赋就是一个空的list[] c[0][1] = 555 c[1][1].append([1,2,3]) print(c) # defaultdict(<function <lambda> at 0x7fab419087b8>, {0: defaultdict(<class 'list'>, {1: 555}),1: defaultdict(<class 'list'>, {1: [[1, 2, 3]]})})
2 deque 双向队列
若使用Python的list,
通过list.pop(0)
去除头部会消耗O(n)的时间.而使用双向队列时间复杂度是O(1)
3 Counter most_common()
1> 不仅可以统计list中元素的出现次数,也可以对str中的元素进行统计
# collections包中的Counter用于统计str list 中元素出现次数 from collections import Counter a = [1,1,2,3,4,5,6,6,6] b = Counter(a) # 输出一个a中每个元素出现次数的类,且按出现次数由高到低排列 print(b) # 输出元素5的出现次数 print(b[5]) # 输出出现次数前三的(元素,次数)对,且类型是list print(b.most_common(3)) # Counter({6: 3, 1: 2, 2: 1, 3: 1, 4: 1, 5: 1}) # 1 # [(6, 3), (1, 2), (2, 1)] # 如下直接输出元素按出现次数由高到低的排序,用的most_common()目的是将Counter(a)化为list,便于迭代 print([item for items, c in Counter(a).most_common() for item in [items] * c]) # [6, 6, 6, 1, 1, 2, 3, 4, 5]
参考:http://www.aiisen.com/p/1166376.html