Skip to content

Latest commit

 

History

History
74 lines (55 loc) · 1.74 KB

1.6.在字典中映射Key到多个Value.md

File metadata and controls

74 lines (55 loc) · 1.74 KB

1.6.在字典中映射Key到多个Value

问题

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在解决分组记录的问题上很接近。