获取值唯一的字典项的最优实现方法
筛选字典中值唯一(或仅保留每个值首次出现项)的最优实现方法
给定字典:
dic = {'a': 100, 'b': 100, 'c': 90}
需求是得到仅包含每个值首次出现的键值对(唯一值全部保留)的字典,期望结果:
dic_b = {'a': 100, 'c': 90}
最优实现方法
推荐使用统计值频次+遍历去重的方式,兼顾效率与可读性,Python 3.7+下能完美保留原字典的插入顺序:
from collections import Counter dic = {'a': 100, 'b': 100, 'c': 90} # 统计每个值的出现次数 value_counts = Counter(dic.values()) # 记录已经添加过的值 seen = set() result = {} for key, val in dic.items(): if val not in seen: result[key] = val seen.add(val) print(result) # 输出: {'a': 100, 'c': 90}
方法说明
- 时间复杂度为O(n)(n是字典键值对数量),
Counter统计和遍历字典都是线性操作,效率极高; - 通过
seen集合记录已添加的值,确保每个值只保留首次出现的键值对,完全符合示例需求; - 代码逻辑清晰,易维护,适合大多数场景。
如果追求极简代码且不在意保留首次出现的顺序(或可接受保留最后一次出现的键),也可以用字典推导式反转字典的方式,但这种方式无法直接保留首次出现的键,需要额外处理反向遍历:
dic = {'a': 100, 'b': 100, 'c': 90} # 反向遍历原字典,让首次出现的键覆盖后续重复值的键 reverse_map = {val: key for key, val in reversed(dic.items())} # 再反转回原结构 result = {key: val for val, key in reverse_map.items()} print(result) # 输出: {'a': 100, 'c': 90}
不过这种方式可读性稍差,不如第一种方法直观。
内容的提问来源于stack exchange,提问作者Elicon
相关产品推荐
相关产品推荐

