如何将含重复键的两个列表合并为单键多值的Python字典?
如何将重复键的对应值合并为列表来构建字典?
我懂你的痛点——用zip()直接转字典的时候,重复的键会被最后一个值覆盖,这确实不是你想要的效果。不过有几种简单的方法可以帮你把相同键的所有值都收集到列表里,实现目标格式的字典。
方法1:手动循环判断(适合理解原理)
最直观的方式就是初始化一个空字典,然后遍历每一对键值,手动处理列表的创建和追加:
list1 = ['sys_time', 'sys_time', 'sys_time'] list2 = ['2018-03-16T11:00:00.000-07:00', '2018-03-12T00:00:00.000-07:00', '2018-03-14T00:00:00.000-07:00'] result = {} for key, value in zip(list1, list2): # 如果键不在字典里,先创建一个空列表 if key not in result: result[key] = [] # 把当前值追加到对应的列表里 result[key].append(value) print(result)
执行后就会得到你想要的结果:
{'sys_time': ['2018-03-16T11:00:00.000-07:00', '2018-03-12T00:00:00.000-07:00', '2018-03-14T00:00:00.000-07:00']}
方法2:使用collections.defaultdict(简洁高效)
Python标准库的collections模块里的defaultdict专门解决这种问题——它会自动为不存在的键创建指定类型的默认值(这里是列表),代码会更简洁:
from collections import defaultdict list1 = ['sys_time', 'sys_time', 'sys_time'] list2 = ['2018-03-16T11:00:00.000-07:00', '2018-03-12T00:00:00.000-07:00', '2018-03-14T00:00:00.000-07:00'] # 初始化一个默认值为列表的字典 result = defaultdict(list) for key, value in zip(list1, list2): # 直接追加值就行,不用判断键是否存在 result[key].append(value) # 可选:如果需要转换成普通的dict类型 result = dict(result) print(result)
方法3:使用dict.setdefault()(紧凑写法)
dict自带的setdefault()方法也能实现类似效果,它会返回键对应的值(如果键不存在就先设置默认值再返回),可以链式调用append():
list1 = ['sys_time', 'sys_time', 'sys_time'] list2 = ['2018-03-16T11:00:00.000-07:00', '2018-03-12T00:00:00.000-07:00', '2018-03-14T00:00:00.000-07:00'] result = {} for key, value in zip(list1, list2): # 不存在的键会自动创建空列表,然后追加值 result.setdefault(key, []).append(value) print(result)
这三种方法都能达到你的需求,其中defaultdict的写法最简洁高效,适合日常开发使用;手动循环的方式则更适合理解背后的逻辑。
内容的提问来源于stack exchange,提问作者Jignasha Royala
相关产品推荐
相关产品推荐

