Python 字典中的键映射多个值

字典中的键映射多个值

问题

如何实现一个字典(multidict)的键对应多个值?

解决方法

字典的定义就是一个键对应一个单值的映射。如果想要一个键映射多个值,那么需要将多个值放到其他容器中,例如列表和集合当中,示例代码如下:

a = {
    'x': [1,2,3],
    'y': [4,5]
}

b = {
    'x': {1,2,3},
    'y': {4,5}
}

而选择使用列表还是集合取决于实际的需求。如果需要保持插入元素的顺序,建议选择列表;如果需求需要去掉重复的元素,建议选择集合。

Python 提供的 collections 模块中,defaultdict 可以实现构造这样的字典。defaultdict 有个特征是能够自动初始化每个 key 刚开始对应的值,所以只需要进行添加元素的操作。示例如下:

from collections import defaultdict

dl = defaultdict(list)
dl['x'].append(1)
dl['x'].append(2)
dl['y'].append(3)

ds = defaultdict(set)
ds['x'].add(1)
ds['x'].add(2)
ds['y'].add(3)

print(dl)
print(ds)

这里需要注意的是,defaultdict 会自动为将要访问的键(即使目前字典中不存在这个键)创建映射实体。所以如果不需要这种特性,可以在普通字典中使用 setdefault() 方法代替。示例如下:

d = {}
d.setdefault('x', []).append(1)
d.setdefault('x', []).append(2)
d.setdefault('y', []).append(3)

但这种方法被认为过于繁琐,因为每次调用都要创建新的初始值示例,例如上面代码中的空列表([]

代码解析

上面提及的映射多值的字典,实际上也能够自己实现,但是对于值的初始化会比较麻烦,示例如下:

d = {}
for key, value in items:
    if key not in d:
        d[key] = []
    d[key].append(value)

而使用 defaultdict 则会更加简洁:

d = defaultdict(list)
for key, value in items:
    d[key].append(value)

以上就是这篇文章的主要内容。

发布了52 篇原创文章 · 获赞 16 · 访问量 5740

猜你喜欢

转载自blog.csdn.net/weixin_45642918/article/details/103547506