HOWTO · Python

Python 中具有多个值的字典

本教程演示如何在 python 中为字典中的键添加多个值

本页内容

Python 字典为每个键存储一个值。这个值可以是列表,因此你可以让一个键关联多个项目,并在数据到达时继续添加项目。

例如,下面键 "a" 对应的值是列表 [1, 2]:

d = {"a": [1, 2], "b": [2, 3], "c": [4, 5]}
print(d)

这种模式适用于归组重复的键,或将多个相关值放在一起。下面的示例分别展示可重复使用的辅助函数、defaultdict 和 setdefault()。

使用自定义函数向字典中的键添加多个值

辅助函数可以在键首次出现时初始化它,然后使用 extend() 将可迭代对象中的每个项目添加到现有列表中。这里的函数会修改并返回传入的字典;它不会把传入的列表作为嵌套项目存储。

运行以下示例:

def add_values(mapping, key, values):
    if key not in mapping:
        mapping[key] = []
    mapping[key].extend(values)
    return mapping


word_freq = {"tutorial": [2, 3, 5]}
add_values(word_freq, "tutorial", [20, 21, 22])
print(word_freq)

如果你需要一个命名操作,或要在多个位置重复使用相同的初始化逻辑,这种方法就很实用。将列表等可迭代对象传给 extend();其中的每个项目都会添加到目标列表中。

使用 defaultdict 向字典中的键添加多个值

从 collections 导入 defaultdict,并将 list 设为它的默认工厂。查找不存在的键时,会创建并存储一个新列表,因此很适合归组包含重复键的键值对。普通字典查找不存在的键时会引发 KeyError;defaultdict 并非在所有操作中都能避免这种情况,因为它的工厂用于 d[key] 这类查找,而不用于 get() 等方法。

以下示例会将每个值归到对应的键下:

from collections import defaultdict

pairs = [("rome", 1), ("paris", 2), ("newyork", 3), ("paris", 4), ("delhi", 1)]
grouped = defaultdict(list)
for key, value in pairs:
    grouped[key].append(value)

print(dict(grouped))

当你要根据可迭代的键值对构建映射时,可以使用这种写法。打印前将结果转换为 dict,即可显示归组后的数据,而不带 defaultdict 类型包装。

使用 setdefault() 方法向字典中的特定键添加多个值

setdefault() 会返回键当前存储的值。如果键不存在,它会插入给定的默认值并返回该值。省略默认值参数时,默认值是 None;本例传入了一个空列表,因此返回值可以用于 append()。

pairs = [("rome", 1), ("paris", 2), ("newyork", 3), ("paris", 4), ("delhi", 1)]
data = {}
for key, value in pairs:
    data.setdefault(key, []).append(value)

print(data)

如果每个输入键值对贡献一个项目,可以在简洁的循环中使用 setdefault()。若初始化逻辑较复杂或需要重复使用,辅助函数或 defaultdict 可能更容易维护。