collections模块

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]]})})
View Code

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]
View Code

参考:http://www.aiisen.com/p/1166376.html

posted on 2019-12-09 15:46  吃我一枪  阅读(272)  评论(0编辑  收藏  举报

导航