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中重复的内容:
- 把
dict_a中所有值提取到一个集合里(集合的元素查找效率远高于列表) - 遍历
dict_b的键值对,过滤掉出现在集合里的元素 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
相关产品推荐
相关产品推荐

