如何反转字典后移除所有非唯一键值对且不修改原字典?
解决字典反转并移除非唯一键值对的问题
你的代码逻辑存在缺陷:当某个值出现奇数次时,最后一次遍历会将其重新添加到反转字典中。比如输入里值1出现了3次,第一次遍历'one':1时添加1:'one',第二次遍历'uno':1时删除该键,第三次遍历'un':1时因为字典里已无1,又会添加1:'un',最终导致结果不符合预期。
方案一:先统计值的出现次数,再构建反转字典
先遍历原字典统计每个值的出现次数,只对出现次数为1的键值对进行反转,确保最终结果里只保留唯一值对应的键。
def invert(d): # 统计每个值的出现次数 value_counts = {} for val in d.values(): value_counts[val] = value_counts.get(val, 0) + 1 # 构建符合要求的反转字典 inverted_dict = {} for key, val in d.items(): if value_counts[val] == 1: inverted_dict[val] = key return inverted_dict
测试验证:
>>> invert({'one':1, 'two':2, 'uno':1, 'dos':2, 'three':3, 'un':1}) {3: 'three'}
方案二:用collections.Counter简化统计
借助Python标准库的Counter工具可以更简洁地完成值的统计,再通过字典推导式快速生成结果:
from collections import Counter def invert(d): val_counts = Counter(d.values()) return {val: key for key, val in d.items() if val_counts[val] == 1}
两种方案都不会修改原字典,完全满足需求。
内容的提问来源于stack exchange,提问作者Toodles
相关产品推荐
相关产品推荐

