Python 标准库

collections

2022-12-15

collections 是 [[Python]] 标准库中一些专门化的容器,提供了对通用内建容器 dict、list、set、tuple 的补充。

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

namedtuple()

namedtuple 可以为每一个元素命名,方便访问。

collections.namedtuple(
typename,
field_names,
*,
rename=False,
defaults=None,
module=None,
)
  • typename: 元组名称
  • field_names: 元组元素名称
  • rename: 是否允许元素名称重复
  • defaults: 默认值
  • module: 模块名称
from collections import namedtuple
tup = 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

ChainMap()

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

collections.ChainMap(*maps)
  • maps: 多个容器
from collections import ChainMap
a = {"a": "A", "b": "42"}
b = {"b": "B", "d": "D",}
m = 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(iterable)
  • iterable: 可迭代对象
from collections import Counter
# 用下面三种方式创建的结果都是一样的
# 第一种会自动计算重复出现的次数, 用元组也可以
Counter(["a", "b", "a", "b", "c", "b"])
Counter({"a": 2, "b":3, "c": 1})
Counter(a=2, b=3, c=1)
# 返回: Counter({'b': 3, 'a': 2, 'c': 1})

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

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

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

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

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

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

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

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

3.10 起支持计算总值:

cc.total() # 返回

OrderedDict

返回一个 dict 子类的实例,它具有专门用于重新排列字典顺序的方法。

collections.OrderedDict([items])

defaultdict()

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

collections.defaultdict(default_factory=None, **kwargs)
  • default_factory: 初始值,默认为 None
  • kwargs: 关键字参数
from collections import defaultdict
def default_value():
return "42"
d = defaultdict(default_value, {"a": 1, "b": 2})
print(d["a"]) # 返回 1
print(d["c"]) # 返回默认值 42

参考