multidict的实现?(映射Key到多个Value)
字典是单个Key到Value的映射。如果想多Key多Value,那么可以把多个Value存放到容器中(list,set),比如:
d = {
'a' : [1, 2, 3],
'b' : [4, 5]
}
e = {
'a' : {1, 2, 3},
'b' : {4, 5}
}
关于是使用list还是set取决于应用场景。如果你想保留元素的插入顺序,就使用list;如果你想消除重复(而不考虑排序),就使用set。
想简单构建这样的字典,可以用collections
模块的defaultdict
,defaultdict的特点是会自动初始化第一个值,所以你只关心添加元素就行,例如:
from collections import defaultdict
d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(4)
...
d = defaultdict(set)
d['a'].add(1)
d['a'].add(2)
d['b'].add(4)
...
需要注意的一点是,defaultdict
将在Key访问后自动创建字典条目(即便这个Key在字典并不存在)。如果不想要这个行为,你可以对普通字典使用setdefault()
方法:
d = {} # A regular dictionary
d.setdefault('a', []).append(1)
d.setdefault('a', []).append(2)
d.setdefault('b', []).append(4)
...
然而defaultdict
这个方法对程序员来说太不人性化了。
原则上讲,构建一个多值字典很简单,然而初始化第一个value很麻烦,你可能这样做:
d = {}
for key, value in pairs:
if key not in d:
d[key] = []
d[key].append(value)
使用defaultdict
简介一些:
d = defaultdict(list)
for key, value in pairs:
d[key].append(value)
本节和1.15在解决分组记录的问题上很接近。