Python中合并值为列表的字典:重复键时合并值集合
合并值为列表的字典(重复键值去重合并)
需求说明
需要合并多个值为列表的字典,当多个字典存在重复键时,将对应的值列表合并成无重复元素的新列表;无重复的键则直接保留其值列表。
示例输入字典:
d1 = {"KEY1": [1, 2, 3]} d2 = {"KEY1": [2, 3, 4]} d3 = {"KEY2": [1, 2, 3]}
期望输出:
- 合并d1和d2:
{"KEY1": [1, 2, 3, 4]} - 合并d1和d3:
{"KEY1": [1, 2, 3],"KEY2": [1, 2, 3]}
方法一:手动遍历去重(直观易懂)
写一个支持任意数量字典输入的函数,逐个遍历每个字典的键值对,手动判断元素是否已存在,避免重复添加:
def merge(*dicts): merged = {} # 遍历传入的每个字典 for d in dicts: for key, values in d.items(): # 如果键还没在结果里,先初始化空列表 if key not in merged: merged[key] = [] # 逐个添加元素,只加不在列表里的 for val in values: if val not in merged[key]: merged[key].append(val) return merged
测试验证:
print(merge(d1, d2)) # 输出: {'KEY1': [1, 2, 3, 4]} print(merge(d1, d3)) # 输出: {'KEY1': [1, 2, 3], 'KEY2': [1, 2, 3]}
方法二:集合去重(高效简洁)
如果不介意列表元素的顺序,用集合自动去重的特性可以简化代码,处理大数据量时效率更高:
def merge(*dicts): merged = {} for d in dicts: for key, values in d.items(): if key in merged: # 合并两个列表后转集合去重,再转回列表 merged[key] = list(set(merged[key] + values)) else: # 复制原列表,避免后续修改影响原字典 merged[key] = values.copy() return merged
注意:集合会打乱元素的原有顺序,如果需要保持元素首次出现的顺序,用下面的方法。
方法三:保持顺序的去重合并
Python 3.7+的字典是有序的,利用dict.fromkeys可以在去重的同时保留元素首次出现的顺序:
def merge(*dicts): merged = {} for d in dicts: for key, values in d.items(): if key in merged: # 合并两个列表,用dict.fromkeys去重后转列表 combined = merged[key] + values merged[key] = list(dict.fromkeys(combined)) else: merged[key] = values.copy() return merged
这个方法处理merge(d1,d2)时,会得到和原列表顺序一致的[1,2,3,4]。
内容的提问来源于stack exchange,提问作者Andrey Smirnov
相关产品推荐
相关产品推荐

