OrderedDict
字典是无序的,有序字典能够使字典保持有序。不过OrderedDict
使用一个双向链表实现,增加了内存开销。使用sys.getsizeof()
查看内存使用情况,可以看出有序字典开销较大。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from collections import OrderedDict import sys
dict1 = { 'name': 'wang', 'age': 22 }
dict2 = OrderedDict() dict2['name'] = 'wang' dict2['age'] = 22
print(dict1, sys.getsizeof(dict1)) print(dict2, sys.getsizeof(dict2))
|
defaultdict
构建一键多值字典。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from collections import defaultdict
d = defaultdict(list) d['a'].append('ab') d['a'].append('acd') d['a'].append('bef')
print(d)
s = defaultdict(set) s['a'].add('ab') s['a'].add('ab') s['b'].add('b')
print(s)
|
Counter
统计每个元素出现的次数,也有类似排行榜的功能,如取出现次数最多的三个元素。
1 2 3 4 5 6
| from collections import Counter
c = Counter('python cookbook')
print(c) print(c.most_common(2))
|
ChainMap
使用ChainMap可以将多个字典联合起来。使用update
也可以合并字典,不过合并后的字典不与以前的字典发生联系,且只能合并两个。显然,ChainMap
显得比较灵活。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| from collections import ChainMap
dict1 = { 'a': 3, 'b': 4 }
dict2 = { 'b': 5, 'c': 6 }
dict3 = ChainMap(dict1, dict2) print(dict3['b'])
dict4 = dict(dict1, **dict2) print(dict4['b'])
|
namedtuple
命名元组能够让元组以属性的形式访问,增加可读性。另外注意,元组是以,
区分,而非()
。_asdict
使命名元组转化为有序字典。
1 2 3 4 5 6 7 8 9 10
| from collections import namedtuple
Host = namedtuple('Host', ['hostname', 'port']) h = Host('127.0.0.1', 3000)
print(h.hostname) print(h.port)
print(h._asdict())
|