import:: import collections doc:: collections


  • ChainMap : 类似字典的容器
  • Counter : 字典的子类, 可以计算
  • defaultdict : 字典的子类, 为字典的键提供一个默认值
  • namedtuple : 命名元组
  • deque: 双端队列
  • OrderedDict: 记住字典中键增加的顺序

ChainMap

无需合并便可以把多个容器链接在一起,以作为一个容器去处理。

import collections
 
a = {"a": "A", "b": "42"}
b = {"b": "B", "d": "D",}
 
m = collections.ChainMap(a, b)
m["b"]           # 返回 42
list(m.keys())   # 返回['b', 'd', 'a']
list(m.values()) # 返回['42', 'D', 'A']

ChainMap 映射的数据是可变的,更新对应字典的值会直接反应的映射中。

# 修改 b 值为 B,字典 a 和 m 的值会同步被修改
m["b"] = "B"
 
# 如果不想再原表上做修改,可以使用 new_child() 方法
m2 = m1.new_child()
# 这样修改 m2 的值不会影响到 m 和原字典。
# m2 返回: ChainMap({'b': 24}, {'a': 'A', 'b': '42'}, {'b': 'B', 'd': 'D'})

.new_child() 会在列表的最前面新增一个字典。

Counter

# 用下面三种方式创建的结果都是一样的
# 第一种会自动计算重复出现的次数, 用元组也可以
collections.Counter(["a", "b", "a", "b", "c", "b"])
collections.Counter({"a": 2, "b":3, "c": 1})
collections.Counter(a=2, b=3, c=1)
# 返回: Counter({'b': 3, 'a': 2, 'c': 1})

和其他数据结构一样,也支持新建一个空的:

cc = collections.Counter() # 返回: Counter()
# 可以使用 update 增加元素
cc.update(("a", "a")) # 返回 Counter({'a': 2})

访问的方式可以字典一样, 不过如果访问的键不存在,会返回 0:

cc.["a"] # 返回 2
cc.["z"] # 返回 0

另外 .elements 会以 迭代器 的方式返回所有的元素:

(cc.elements())
["a", "a"]

也可以直接统计次数最高的元素:

cc = collections.Counter(["a", "b", "a", "b", "c", "b"])
 
# 默认返回所有,也支持提供参数,返回指定数量
cc.most_common()
# 返回: [('b', 3), ('a', 2), ('c', 1)]

3.10 起支持计算总值:

cc.total() # 返回

defaultdict

当字典键不存在时,返回默认值:

def default_value():
    return "42"
 
d = collections.defaultdict(default_value, {"a": 1, "b": 2})
 
print(d["a"])   # 返回 1
print(d["c"])   # 返回默认值 42

namedtuple

命名元组

import collections
 
tup = collections.namedtuple("Tup", "name, age")
bob = tup(name="Bob", age="42")
 
print(bob)      # 返回: Tup(name='Bob', age='42')
print(bob.name) # 返回: Bob
print(bob[0])   # 返回: Bob