基本介绍
collections 模块----Python标准库,是数据结构常用模块
常用类型有:
- 计数器(Counter)
- 双向队列(deque)
- 默认字典(defaultdict)
- 有序字典(OrderedDict)
- 可命名元组(namedtuple)
Counter
from collections import Counter
>>> str = "abcbcaccbbad"
>>> li = [2, 3, 43, 3, 45, 54, 33, 33, 1]
>>> d = {'d':3, 'f':4, 'g':3, 'h':5}
# 获取元素个数,返回字典
>>> print(dict(Counter(str)))
>>> print(dict(Counter(d)))
>>> print(dict(Counter(li)))
# most_common(int) 按照元素出现的次数进行从高到低的排序,返回前int个元素的字典
>>> print(Counter(str).most_common(2))
# elements返回经过计算器Counter后的元素,返回的是一个迭代器
>>> print(''.join(Counter(str).elements()))
# update更新,做加法,加上对应的个数
>>> x = Counter(str)
>>> x.update("sas1")
>>> print(dict(x))
# subtract,做减法,减去对于的个数
>>> y = Counter(li)
>>> y.subtract([3, 2])
>>> print(dict(y))
>>> print(y)
# 获取key和value
>>> print(list(Counter(str).items())) #字典的key和value
>>> print(list(Counter(str).keys())) #字典的key
>>> print(list(Counter(str).values())) #字典的value
defaultdict
>>> from collections import defaultdict
# 普通的dict当引用的key不存在的时候会报错, 而defaultdict不会, 它可以给字典的值设置一个类型,
# 当key不存在时可以自动生成相应类型的value。
# 如下可以直接设置为list str int dict等,这些内置类型在没有参数调用时返回空类型。
>>> d = defaultdict(list)
>>> print(d)
>>> defaultdict(<class 'list'>, {})
print(d[2]) # 新建一个key后,值是一个默认的空list
[]
>>> d[1] = 5
>>> print(d)
defaultdict(<class 'list'>, {2: [], 1: 5})
# defaultdict接受的参数必须是可调用的,若直接传递数字0,就会出现TyptError的异常
# 如下设置默认值为0,不用lambda会报错,这里用lambda相当于一个没有传入值, 只有返回值的函数
>>> a = defaultdict(lambda :0)
>>> print(a[1])
0
>>> print(a)
defaultdict(<function <lambda> at 0x7fac3db7bea0>, {1: 0})
# defaultdict类除了接受类型名称作为初始化函数的参数之外,还可以使用任何不带参数的可调用函数,到时该函数的返回结果作为默认值,这样使得默认值的取值更加灵活
>>> def fun():
>>> return [1,2,3]
>>> b = collections.defaultdict(fun)
# 如下已经新建了一个key
>>> b[3]
>>> print(b[1])
[1, 2, 3]
>>> print(b)
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]]})})
deque
from collections import deque
>>> q = deque([1, 2, 3, 4, 5])
deque([1, 2, 3, 4, 5])
>>> q = deque([1, 2, 3, 4, 5], maxlen=6)
deque([1, 2, 3, 4, 5], maxlen=6)
# 右边添加一个元素
>>> q.append(1)
# 获取最右边一个元素,并在队列中删除
>>> v = q.pop()
# 右边添加多个元素
>>> q.extend([1, 2, 3])
# 左边添加一个元素
>>> q.appendleft(0)
# 获取最左边一个元素,并在队列中删除
>>> v = q.popleft()
# 坐标添加多个元素
>>> q.extendleft([-1, -2, -3])
# 浅拷贝 python2中没有
>>> q1 = q.copy()
# count(返回指定元素的出现次数)
>>> q.count(1)
# index(查找某个元素的索引位置)
>>> q.index(1)
# 插入
>>> q.insert(1, 'a')
>>> q.clear()
>>> q.reverse()
# deque支持in操作符
>>> print(6 in q)
False
>>> print(5 in q)
True
# 顺时针旋转
q.rotate(1) # 参数为旋转的位数
# 逆时针旋转
q.rotate(-1)
OrderedDict
from collections import OrderedDict
>>> d = OrderedDict()
>>> d
OrderedDict()
>>> d['name'] = 'du'
>>> print(d)
OrderedDict([('name', 'du')])
>>> d['age'] = 18
>>> print(d)
OrderedDict([('name', 'du'), ('age', 18)])
namedtuple
namedtuple是一个 工厂函数,定义在python标准库的collections模块中,使用此函数可以创建一个可读性更强的元组namedtuple函数所创建(返回)的是一个 元组的子类(python中基本数据类型都是类,且可以在buildins模块中找到)namedtuple函数所创建元组,中文名称为 具名元组- 在使用普通元组的时候,我们只能通过
index来访问元组中的某个数据 - 使用具名元组,我们既可以使用
index来访问,也可以使用具名元组中每个字段的名称来访问 - 值得注意的是,具名元组和普通元组所需要的内存空间相同,所以 不必使用性能来权衡是否使用具名元组
from collections import namedtuple
def namedtuple(typename, field_names, *, rename=False, defaults=None, module=None):
pass
>>> Point = namedtuple('Point', ['x', 'y']) # 返回一个名为`Point`的类,并赋值给名为`Point`的变量
>>> p = Point(11, y=22) # 可以根据参数的位置,或具名参数来实例化(像普通的类一样)
>>> p[0] + p[1] # 具名元组可以像普通元组一样通过`index`访问
33
>>> x, y = p # 具名元组可以像普通元组一样解包
>>> x, y
(11, 22)
>>> p.x + p.y # 具名元组还可以通过属性名称访问元组内容
33
>>> p # 具名元组在调用`__repr__`,打印实例时,更具可读性
Point(x=11, y=22)