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

Python中如何比较键不同但值相似的字典并删除重复值?

解决字典值重复的问题

你的需求是保留dict_a原样,删除dict_b中所有和dict_a重复的元素,得到目标字典。

你的代码为什么无效?

你之前写的dict_b_new = {k: dict_b[k] for k in set(dict_b) - set(dict_a)}是在对比两个字典的键,但你的两个字典键本身就完全不同(dict_a是r1/r2/r3,dict_b是f1),所以集合差集结果还是{f1},最终dict_b_new和原dict_b完全一致,根本没处理值的重复问题。

正确解决方案

核心思路是先收集dict_a里的所有元素,再过滤dict_b中重复的内容:

  1. 把dict_a中所有值提取到一个集合里(集合的元素查找效率远高于列表)
  2. 遍历dict_b的键值对,过滤掉出现在集合里的元素
  3. dict_a_new直接复用原字典即可(若担心后续修改影响原字典,可做浅拷贝)

代码示例:

dict_a = {'r1': ['c5', 'c6', 'c7', 'c8'], 'r2': ['c9', 'c10', 'c11'], 'r3': ['c12', 'c13', 'c14', 'c15']}
dict_b = {'f1': ['c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'c10', 'c11', 'c12', 'c13', 'c14', 'c15']}

# 收集dict_a中所有元素到集合(两种写法任选其一)
# 写法1:循环遍历
a_all_values = set()
for lst in dict_a.values():
    a_all_values.update(lst)
# 写法2:集合生成式,更简洁
# a_all_values = {item for lst in dict_a.values() for item in lst}

# 过滤dict_b中的重复元素
dict_b_new = {key: [item for item in value if item not in a_all_values] for key, value in dict_b.items()}

# 保留dict_a原样,用copy避免后续修改原字典影响新字典(不需要修改的话直接赋值也可)
dict_a_new = dict_a.copy()

# 输出结果
print(dict_a_new)
print(dict_b_new)

运行结果完全符合你的需求:

{'r1': ['c5', 'c6', 'c7', 'c8'], 'r2': ['c9', 'c10', 'c11'], 'r3': ['c12', 'c13', 'c14', 'c15']}
{'f1': ['c1', 'c2', 'c3', 'c4']}

补充说明

  • 使用集合存储dict_a的元素,是因为item not in 集合的判断时间复杂度为O(1),比列表的O(n)快很多,数据量大时优势明显。
  • 如果不需要修改dict_a_new里的列表元素,直接dict_a_new = dict_a也可以,用copy()是为了隔离原字典和新字典的修改影响。

内容的提问来源于stack exchange,提问作者who-cares2023

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:01:55