这个模块实现了特定目标的容器,以提供Python标准内建容器 dict
, list
, set
, 和 tuple
的替代选择。
namedtuple() |
创建命名元组子类的工厂函数 |
deque |
类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop) |
ChainMap |
类似字典(dict)的容器类,将多个映射集合到一个视图里面 |
Counter |
字典的子类,提供了可哈希对象的计数功能 |
OrderedDict |
字典的子类,保存了他们被添加的顺序 |
defaultdict |
字典的子类,提供了一个工厂函数,为字典查询提供一个默认值 |
UserDict |
封装了字典对象,简化了字典子类化 |
UserList |
封装了列表对象,简化了列表子类化 |
UserString |
封装了列表对象,简化了字符串子类化 |
class collections.deque([ iterable [, maxlen ] ]):返回一个新的双向队列对象,从左到右初始化(用方法 append()) ,从 iterable (迭代对象) 数据创建。如果 iterable 没有指定,新队列为空。Deque队列是由栈或者queue队列生成的(发音是 “deck”,”double-ended queue”的简称)。Deque 支持线程安全,内存高效添加(append)和弹出(pop),从两端都可以,两个方向的大概开销都是 O(1) 复杂度。虽然 list 对象也支持类似操作,不过这里优化了定长操作和 pop(0) 和 insert(0, v) 的开销。它们引起 O(n) 内存移动的操作,改变底层数据表达的大小和位置。如果 maxlen 没有指定或者是 None ,deques 可以增长到任意长度。否则,deque就限定到指定最大长度。一旦限定长度的deque满了,当新项加入时,同样数量的项就从另一端弹出。限定长度deque提供类似Unix filter tail 的功能。它们同样可以用与追踪最近的交换和其他数据池活动。
deque的方法介绍:
append(x) # 添加 x 到右端。
appendleft(x) # 添加 x 到左端。
clear() # 移除所有元素,使其长度为0.
copy() # 创建一份浅拷贝。
3.5 新版功能.
count(x) # 计算deque中个数等于 x 的元素。
3.2 新版功能.
extend(iterable) # 扩展deque的右侧,通过添加iterable参数中的元素。
extendleft(iterable) # 扩展deque的左侧,通过添加iterable参数中的元素。注意,左添加时,在结果中iterable参数中的顺序将被反过来添加。
index(x[, start[, stop]]) # 返回第 x 个元素(从 start 开始计算,在 stop 之前)。返回第一个匹配,如果没找到的话,升起 ValueError 。
3.5 新版功能.
insert(i, x) # 在位置 i 插入x,如果插入会导致一个限长deque超出长度 maxlen 的话,就升起一个 IndexError 。
3.5 新版功能.
pop() # 移去并且返回一个元素,deque最右侧的那一个。如果没有元素的话,就升起 IndexError 索引错误。
popleft() # 移去并且返回一个元素,deque最左侧的那一个。如果没有元素的话,就升起 IndexError 索引错误。
remove(value) # 移去找到的第一个 value。 如果没有的话就升起 ValueError 。
reverse() # 将deque逆序排列。返回 None 。
3.2 新版功能.
rotate(n=1) # 向右循环移动 n 步。 如果 n 是负数,就向左循环。如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) ,
向左循环一步就等价于 d.append(d.popleft()) 。
Deque对象同样提供了一个只读属性:maxlen
Deque的最大尺寸,如果没有限定的话就是 None 。
3.1 新版功能.
除了以上,deque还支持迭代,清洗,len(d), reversed(d), copy.copy(d), copy.deepcopy(d), 成员测试 in 操作符,和下标引用 d[-1] 。
索引存取在两端的复杂度是 O(1), 在中间的复杂度比 O(n) 略低。要快速存取,使用list来替代。
class collections.Counter([ iterable-or-mapping ]): 一个 Counter 是一个dict 的子类,用于计数可哈希对象。它是一个集合,元素像字典键(key)一样存储,它们的计数存储为值。计数可以是任何整数值,包括0和负数。Counter类有点像其他语言中的 bags或multisets。
1)Counter对象初始化
from collections import Counter
# 元素从一个 iterable 被计数或从其他的 mapping (or counter)初始化:
c = Counter() # a new, empty counter
c = Counter('gallahad') # a new counter from an iterable
c = Counter({'red': 4, 'blue': 2}) # a new counter from a mapping
c = Counter(cats=4, dogs=8) # a new counter from keyword args
# Counter对象有一个字典接口,如果引用的键没有任何记录,就返回一个0,而不是弹出一个 KeyError :
c = Counter(['eggs', 'ham'])
c['bacon'] # count of a missing element is zero
0
# 设置一个计数为0不会从计数器中移去一个元素。使用 del 来删除它:
c['sausage'] = 0 # counter entry with a zero count
del c['sausage'] # del actually removes the entry
2)Counter的其它方法
elements():返回一个迭代器,每个元素重复计数的个数。元素顺序是任意的。如果一个元素的计数小于1, elements() 就会忽略它。
c = Counter(a=4, b=2, c=0, d=-2)
sorted(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']
most_common([n]):返回一个列表,提供 n 个频率最高的元素和计数。 如果没提供 n ,或者是 None , most_common() 返回计数器中的 所有 元素。相等个数的元素顺序随机:
Counter('abracadabra').most_common(3) # doctest: +SKIP
[('a', 5), ('r', 2), ('b', 2)]
subtract([iterable-or-mapping]):从迭代对象或映射对象减去元素。像 dict.update() 但是是减去,而不是替换。输入和输出都可以是0或者负数。
c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)
c.subtract(d)
c
Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
本文参考:https://docs.python.org/zh-cn/3/library/collections.html