使用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
相关产品推荐
相关产品推荐

