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

使用zip创建字典遇重复键丢失元素?如何保留所有列表项

关于zip创建字典时重复键导致元素丢失的问题

问题现象

当使用zip结合dict()创建字典时,如果作为键的列表存在重复元素,最终生成的字典长度会比原列表短,出现元素丢失的情况:

names = ['nik', 'katie', 'james', "katie"]
ages = [32, 31, 34, 106]
my_dict = dict(zip(names, ages))
print(my_dict)

执行后输出:

{'nik': 32, 'katie': 106, 'james': 34}

为什么年轻Katie的条目会丢失?

Python字典(dict)的核心规则是键必须唯一。用zip配对两个列表时,会生成('nik',32)、('katie',31)、('james',34)、('katie',106)这一组元组,字典在构建过程中,遇到重复的键katie,后面的106会直接覆盖前面的31,因此只会保留该键最后一次出现的对应值,前面的条目被覆盖消失。

如何保留所有元素?

由于普通字典的键唯一性限制,无法直接生成与原列表长度一致的字典,但可以通过以下方式保留全部数据:

1. 聚合重复键的多个值(存储为列表)

使用collections.defaultdict自动为每个键创建列表,收集相同键的所有对应值:

from collections import defaultdict

names = ['nik', 'katie', 'james', "katie"]
ages = [32, 31, 34, 106]
my_dict = defaultdict(list)
for name, age in zip(names, ages):
    my_dict[name].append(age)
# 转换为普通字典输出
print(dict(my_dict))

执行输出:

{'nik': [32], 'katie': [31, 106], 'james': [34]}

如果不想引入defaultdict,也可以用普通字典手动处理:

names = ['nik', 'katie', 'james', "katie"]
ages = [32, 31, 34, 106]
my_dict = {}
for name, age in zip(names, ages):
    if name not in my_dict:
        my_dict[name] = []
    my_dict[name].append(age)
print(my_dict)

2. 用列表存储所有独立条目(放弃单一字典结构)

如果需要保持与原列表一致的条目数量,可以用列表存储每个键值对的字典或元组:

names = ['nik', 'katie', 'james', "katie"]
ages = [32, 31, 34, 106]
# 列表存储单个字典
result_list = [{'name': name, 'age': age} for name, age in zip(names, ages)]
print(result_list)
# 或直接存储元组
result_tuples = list(zip(names, ages))
print(result_tuples)

执行输出分别为:

[{'name': 'nik', 'age': 32}, {'name': 'katie', 'age': 31}, {'name': 'james', 'age': 34}, {'name': 'katie', 'age': 106}]
[('nik', 32), ('katie', 31), ('james', 34), ('katie', 106)]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:53:16