You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python从列表创建字典:重复键被忽略,如何合并键值?

为什么Python字典默认不合并重复键的值?

这个问题问得很到位!其实这和字典的核心设计定位息息相关:字典从诞生起就是「键唯一的映射结构」,核心优势是通过键快速定位到唯一对应的值。如果Python自动把重复键的值合并成列表,反而会打破大多数场景下的预期——毕竟很多时候我们写代码就是想让后面的重复键覆盖前面的(比如更新配置项)。而且合并的需求也不止一种:有的要合并成列表,有的要累加数值,有的要保留第一个值,Python没办法提前猜到你要哪种,所以就选了最直接、最明确的行为:后面的键值对直接覆盖前面的。

纯Python实现合并重复键的值到列表

接下来给你几种纯Python的实现方式,从最直观的手动循环到简洁的标准库方法,你可以根据场景选择:

方法1:手动循环(新手友好,一目了然)

假设你手里是一个包含键值对的元组列表,比如items = [('a', 1), ('b', 2), ('a', 3), ('b', 4)],我们可以初始化空字典,逐个遍历键值对,把值追加到对应键的列表里:

items = [('a', 1), ('b', 2), ('a', 3), ('b', 4)]
result = {}

for key, value in items:
    if key not in result:
        # 键不存在时,先创建一个空列表
        result[key] = []
    result[key].append(value)

print(result)  # 输出: {'a': [1, 3], 'b': [2, 4]}

方法2:用字典内置方法简化代码

字典的setdefault()方法可以帮我们省去判断键是否存在的步骤,代码更紧凑高效:

items = [('a', 1), ('b', 2), ('a', 3), ('b', 4)]
result = {}

for key, value in items:
    # setdefault:键不存在时自动设置默认值为[],然后直接追加值
    result.setdefault(key, []).append(value)

print(result)  # 输出和上面一致的结果

这是Python字典自带的功能,完全属于纯Python实现,不需要依赖任何外部库。

方法3:用标准库的defaultdict(简洁省心)

如果你觉得上面的写法还是有点麻烦,可以用Python标准库collections里的defaultdict——它会在你访问不存在的键时,自动创建指定类型的默认值(比如列表):

from collections import defaultdict

items = [('a', 1), ('b', 2), ('a', 3), ('b', 4)]
result = defaultdict(list)

for key, value in items:
    result[key].append(value)

# 如果需要转换成普通字典(非defaultdict类型),直接用dict()包装就行
print(dict(result))  # 输出: {'a': [1, 3], 'b': [2, 4]}

别担心,collections是Python自带的标准库,完全属于纯Python实现,不需要额外安装任何包。

特殊场景:扁平列表转合并字典

如果你的列表是扁平的,比如flat_list = ['a', 1, 'b', 2, 'a', 3](键值交替出现),可以先把它拆成键值对,再用上面的方法:

flat_list = ['a', 1, 'b', 2, 'a', 3]
# 用切片和zip把扁平列表分组为键值对元组
items = zip(flat_list[::2], flat_list[1::2])

result = {}
for key, value in items:
    result.setdefault(key, []).append(value)

print(result)  # 输出: {'a': [1, 3], 'b': [2]}

内容的提问来源于stack exchange,提问作者Watarap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:04:05