Python合并字典时排除重复值:能否用|或**语法实现?
合并字典:同键列表去重合并的实现方案
直接使用|运算符或(**dict1, **dict2)解包语法无法直接实现你要的逻辑——这两种方式的核心规则是「键冲突时,后一个字典的值直接覆盖前一个」,不会对同键对应的列表做合并去重操作,这也是你用|时得到覆盖结果的原因。
不过你可以基于字典推导式,结合这两种语法的思路,实现符合需求的合并逻辑,同时避免修改原字典(你的原函数会直接修改dict1,新方案更安全):
基础实现(不保证元素顺序)
利用集合去重,代码简洁但会打乱列表原有顺序:
def dict_merge(dict1, dict2): # 获取所有唯一键 all_keys = dict1.keys() | dict2.keys() return { key: list(set(dict1.get(key, []) + dict2.get(key, []))) for key in all_keys }
测试示例:
- 输入
dict_merge({'A': [1, 2, 3]}, {'A': [2, 3, 4]}),输出{'A': [1, 2, 3, 4]}(顺序可能因集合特性略有不同) - 输入
dict_merge({'A': [1, 2, 3]}, {'B': [2, 4, 5, 6]}),输出{'A': [1, 2, 3], 'B': [2, 4, 5, 6]}
保留元素顺序的实现
如果需要保留列表元素的原有顺序,可以自定义合并逻辑:
def dict_merge(dict1, dict2): all_keys = dict1.keys() | dict2.keys() def merge_unique(l1, l2): merged = l1.copy() for item in l2: if item not in merged: merged.append(item) return merged return { key: merge_unique(dict1.get(key, []), dict2.get(key, [])) for key in all_keys }
测试示例:
- 输入
dict_merge({'A': [1, 2, 3]}, {'A': [2, 3, 4]}),输出{'A': [1, 2, 3, 4]},顺序完全保留。
内容的提问来源于stack exchange,提问作者Begginer
相关产品推荐
相关产品推荐

