collections是Python内建的一个集合模块,提供了许多有用的集合类。
对象(函数) | 说明 |
---|---|
Counter | 提供快速及方便的计数器的dict子类 |
deque | 双向队列 |
defaultdict | 为缺失值提供默认值的dict子类 |
namedtuple() | 用于创建具有字段的元组子类的工厂函数 |
OrderedDict | 使字典的key保持有序的字典子类 |
注:由于python3.7已经支持dict类型的有序,故这里就不再介绍OrderedDict,需要的可以参考官方文档
class collections.Counter([iterable-or-mapping])
Counter对象的初始化,如下
from collections import Counter
c = Counter() # 空的Counter对象
c = Counter('demo_string') # 从iterable中初始化Counter对象
c = Counter({'a': 2, 'b': 5}) # 从mapping中初始化Counter对象
c = Counter(a=2, b=5) # 使用键值对初始化Counter对象
string = 'pythonnohtyp'
c = Counter(string)
# Counter({'p': 2, 'y': 2, 't': 2, 'h': 2, 'o': 2, 'n': 2})
注:Counter对象的值可正,可负或为0;即Counter(a=-1, b=0, c=1)
Counter对象继承了字典的大部分方法(除了update,fromkeys),同时添加了一些其他的方法
Counter.elements()
c = Counter(a=1, b=5, c=0, d=-1)
l = list(c.elements())
l # ['a', 'b', 'b', 'b', 'b', 'b']
Counter.most_common([n])
c = Counter(a=1, b=5, c=0, d=-1)
c.most_common()
# [('b', 5), ('a', 1), ('c', 0), ('d', -1)]
c.most_common(0)
# []
c.most_common(2)
# [('b', 5), ('a', 1)]
Counter.subtract([iterable-or-mapping])
c = Counter(a=0, b=2, c=-1)
d = Counter(a=2,d=3)
l = ['a', 'b', 'c']
c.subtract(d)
print(c)
# Counter({'b': 2, 'c': -1, 'a': -2, 'd': -3})
c.subtract(l)
print(c)
# Counter({'b': 1, 'c': -2, 'a': -3, 'd': -3})
说明:
Counter对象继承了字典的大部分方法,但是Counter对象没有fromkeys()方法;
而update([iterable-or-mapping])方法与原字典的update不同,前者是将iterable或mapping对象加上,不会替换已有值,可近似看成subtract()的反操作。
c1 = Counter(a=3, b=1)
c2 = Counter(a=1, b=4)
c1 + c2
# Counter({'b': 5, 'a': 4})
c1 - c2
# Counter({'a': 2})
c1 & c2
# Counter({'a': 1, 'b': 1})
c1 | c2
# Counter({'b': 4, 'a': 3})
class collections.deque([iterable[,maxlen]])
from collections import deque
dq = deque([1, 2, 3], maxlen=6)
print(dq)
# deque([1, 2, 3], maxlen=6)
deque.append(x):从队列deque的右端加入元素x
deque.appendleft(x):从队列deque的左端加入元素x
deque.extend(iterable):从队列deque的右端依次添加iterable中的元素
deque.extendleft(iterable):从队列deque的左端依次添加iterable中的元素
deque.pop():移除队列deque最右端的元素,并返回该元素,若deque为空,则抛出IndexError。
deque.popleft():移除队列deque最左端的元素,并返回该元素,若deque为空,则抛出IndexError。
demo_dq = deque([1, 2, 3, 4, 5, 6])
demo_list = [99, 98, 97]
demo_dq.append(55)
# deque([1, 2, 3, 4, 5, 6, 55])
demo_dq.appendleft(66)
# deque([66, 1, 2, 3, 4, 5, 6, 55])
demo_dq.extend(demo_list)
# deque([66, 1, 2, 3, 4, 5, 6, 55, 99, 98, 97])
demo_dq.extendleft(demo_list)
# deque([97, 98, 99, 66, 1, 2, 3, 4, 5, 6, 55, 99, 98, 97])
demo_dq.pop()
# 97
demo_dq.popleft()
# 97
print(demo_dq)
# deque([98, 99, 66, 1, 2, 3, 4, 5, 6, 55, 99, 98])
deque.copy():对deque队列进行浅拷贝,返回一个新的deque实例对象
deque.clear():清空deque队列的内容
deque.count(x):计算deque队列中元素x的个数
deque.index(x[, start[, stop]]):从位置start开始到位置stop,找到第一个匹配元素x的位置。参数start,stop为可选
deque.insert(i, x):在deque队列的位置i,插入元素x
deque.remove(value):移除队列deque中的元素value,若无队列中无value,则抛出ValueError
deque.reverse():对队列deque进行逆序排序
deque.rotato(n=1):对队列deque向右循环移动 n 步,n为负数时,则向左循环移动。n为 1 时,等价于deque.extendleft(deque.pop());n为 -1 时,等价于deque.extend(deque.popeleft())
demo_dq = deque(['a', 'a', 'b', 'c'])
copy_dq = demo_dq.copy()
copy_dq
# deque(['a', 'a', 'b', 'c'])
copy_dq.clear()
copy_dq
# deque([])
demo_dq.count('a')
# 2
demo_dq.index('b')
# 2
demo_dq.insert(4,'ab')
demo_dq
# deque(['a', 'a', 'b', 'c', 'ab'])
demo_dq.remove('aa')
# Traceback (most recent call last):
# File "", line 1, in
# demo_dq.remove('aa')
# ValueError: deque.remove(x): x not in deque
demo_dq.reverse()
demo_dq
# deque(['ab', 'c', 'b', 'a', 'a'])
demo_dq.rotato(2)
# deque(['a', 'a', 'ab', 'c', 'b'])
class collections.defaultdict([default_factory[,…]])
from collections import defaultdict
dd = defaultdict(int, [('name', 'Mike'), ('gender', 'male')])
dd
# defaultdict(, {'name': 'Mike', 'gender': 'male'})
dd['age']
# 0
dd
# defaultdict(, {'name': 'Mike', 'gender': 'male', 'age': 0})
dd1 = defaultdict(lambda:'N/A')
dd1['a'] = 'AA'
dd1['a']
# 'AA'
dd1['c']
# 'N/A'
collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
from collections import namedtuple
Person = namedtuple('P', 'name, age, job', defaults=['Mike', 21, 'Student'])
p1 = Person()
p1
# P(name='Mike', age=21, job='Student')
p2 = Person('Hajo', 20, 'Student')
p2
# P(name='Hajo', age=20, job='Student')
namedtuple继承了元组的方法,collections模块额外添加了三个方法和两个属性
somenamedtuple._make(iterable):从存在的iterable对象中创建新的namedtuple实例,iterable对象的元素个数需与somenamedtuple类中的field_names的个数相等
somenamedtuple._asdict():将实例化对象somenamedtuple转换为OrderedDict类型,
注:版本python3.8,则转换为dict类型.
somenamedtuple._replace(**kwargs):将指定的字段的值替换成新的值,返回一个新的实例
from collections import namedtupel
Person = namedtuple('P', 'name, age, job', defaults=['Mike', 21, 'Student'])
p_list = ['Shanel', 21, 'Student']
p1 = Person._make(p_list)
p1
# P(name='Shanel', age=21, job='Student')
p1._asdict()
# OrderedDict([('name', 'Shanel'), ('age', 21), ('job', 'Student')])
p1._replace(name='John')
# P(name='John', age=21, job='Student')
somenamedtuple._fields:以元组形式列出field_names
somenamedtuple._fields_defaults:以字典形式列出默认值(defaults),若没有设置默认值,则无该属性.
Person = namedtuple('P', 'name, age, job', defaults=['Mike', 21, 'Student'])
Person._fields
#
Person._fields_defaults
# {'name': 'Mike', 'age': 21, 'job': 'Student'}
笔者水平有限,有错欢迎评论留下,谢谢!!
需要了解更多collections模块的内容可以参考官方文档