- 字典中的键映射多个值
- 问题:
- 怎样实现一个键对应多个值得字典(也叫multidict)?
- 解决方案
- 一个字典就是一个键对应一个单值的映射。如果想要一个键映射多个值,那么,就需要将这么多个 值放到另外的容器中,比如列表或者集合里。比如,可以像下面这样构造字典:
d = {
"a": [1, 2, 3],
"b": [4, 5]
}
e = {
"a": {1, 2, 3},
"b": {4,5}
}
-
选择使用列表还是集合取决于实际需求。如果像保持元素插入的顺序就用列表。如果想去掉重复元素# 就使用集合(并且不关心元素的顺序问题)。
-
可以使用collections模块中的 defaultdict 来构造这样的字典。defaultdict 的一个特性 是它会自动初始化每个key刚开始的对应值。所以只需要关注添加元素操作就行了。比如:
from collections import defaultdict
d = defaultdict(list)
d["a"].append(1)
d["a"].append(2)
d["b"].append(4)
print(d)
d = defaultdict(set)
d["a"].add(1)
d["a"].add(2)
d["b"].add(4)
print(d)
- 需要注意的是,defaultdict 会自动为将要访问的键(就算目前字典中并不存在这样的键)创建映射 实体。如果不需要这样的特性,可以在普通的字典上使用setdefault()方法来代替。比如:
d = {}
d.setdefault("a",[]).append(1)
d.setdefault("a",[]).append(2)
d.setdefault("b",[]).append(4)
print(d)
- 讨论: 一般来讲,创建一个多值映射字典是很简单的。但是如果选择自己实现的话,那么对值得初始化 可能会有点麻烦,可能会像下面这样来实现:
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)