collections 是 Python 内建的一个集合模块,提供了许多有用的集合类。
下面是快捷方式(点击直达)
tuple 和 NamedTuple
、DefaultDict
、Counter
tuple 和 NamedTuple
tuple 不可变的相对性
1 | t = ('text', [11, 22]) |
输出结果:
('text', [11, 22, 33])
immutable 的优势
- 性能优化:在编译时作为常量确定(python是解释型语言)
- 线程安全
- 可哈希(list 对象不可以)
可哈希(hashable)和不可改变性(immutable)
- 如果一个对象在自己的生命周期中有一哈希值(hash value)是不可改变的,那么它就是可哈希的(hashable)的,因为这些数据结构内置了哈希值,每个可哈希的对象都内置了
__hash__
方法.- 所以可哈希的对象可以 通过哈希值进行对比 ,也可以 作为字典的键值 和 作为
set
函数的参数 。Python 中所有不可改变的的对象(imutable objects)都是可哈希的,比如字符串
,元组
,也就是说可改变的容器如字典
,列表
不可哈希(unhashable)。我们用户所定义的类的实例对象
默认是可哈希的(hashable),它们都是唯一的,而 hash 值也就是它们的id。- 因为哈希键一定是不可改变的,所以它们对应的哈希值也不改变。如果允许它们改变,那么它们在数据结构如哈希表中的存储位置也会改变,因此会与哈希的概念违背,效率 会大打折扣。
tuple 拆包
1 | info = ('John Theo', 21, 176, 'Zhejiang University') |
输出结果:
John Theo
结果包含了 位置对应 信息
NamedTuple
NamedTuple 相对 class 节省空间,因为少了很多魔术方法
1 | from collections import namedtuple |
输出结果:
John_Theo 21 176
OrderedDict([('name', 'John_Theo'), ('age', 21), ('height', 176)])
NamedTuple 继承 tuple,也支持拆包。
DefaultDict
1 | from collections import defaultdict |
输出结果:
defaultdict(<function default_generator at 0x0000020AB6FA2EA0>, {'John': 2, 'Jack': 2, 'Jay': 1})
2 2 1 0
Counter
1 | from collections import Counter |
输出结果:
Counter({'a': 3, 's': 3, 'd': 3, 'c': 1})
Counter({'a': 6, 'd': 6, 's': 4, 'w': 2, 'c': 1, 'q': 1})
[('a', 6), ('d', 6)]