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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:35:30