如何检测字典中仅出现一次的值及其对应键
问题描述
给定两个字典:
d = {0:0,1:0,2:0,3:1,4:0,5:0} D = {0:False,1:False,2:False,3:True,4:False,5:False}
需要找出字典里只出现过一次的值,并定位到它对应的键,最终要输出:
Value 1 occurs once at key 3 Value True occurs once at key 3
已经用collections.Counter统计出了值的出现次数:
from collections import Counter print(Counter(d.values())) # 输出:Counter({0: 5, 1: 1}) print(Counter(D.values())) # 输出:Counter({False: 5, True: 1})
但不知道怎么根据这些结果找到对应的值的键。
解决方案
分两步就能搞定:
- 先用
Counter筛选出出现次数为1的值 - 遍历原字典,匹配值找到对应的键
基础实现代码
from collections import Counter def find_single_key(dict_obj): # 统计值的出现次数 count = Counter(dict_obj.values()) # 挑出只出现一次的值 target_values = [v for v, cnt in count.items() if cnt == 1] # 遍历字典找对应键 for val in target_values: for k, v in dict_obj.items(): if v == val: print(f"Value {val} occurs once at key {k}") break # 因为值只出现一次,找到就停 # 测试两个字典 d = {0:0,1:0,2:0,3:1,4:0,5:0} D = {0:False,1:False,2:False,3:True,4:False,5:False} find_single_key(d) find_single_key(D)
运行结果
Value 1 occurs once at key 3 Value True occurs once at key 3
优化版本(适合大字典)
如果字典数据量很大,上面的方法要遍历两次字典,效率有点低。可以换个思路,遍历字典的时候直接记录每个值对应的所有键,之后再找只有一个键的值:
def find_single_key_fast(dict_obj): value_keys = {} for k, v in dict_obj.items(): # 把键加到对应值的列表里 value_keys.setdefault(v, []).append(k) # 筛选出只有一个键的项 for val, keys in value_keys.items(): if len(keys) == 1: print(f"Value {val} occurs once at key {keys[0]}") # 测试效果一样 find_single_key_fast(d) find_single_key_fast(D)
这个版本只需要遍历字典一次,处理大字典的时候速度会快很多。
内容的提问来源于stack exchange,提问作者Hudson Ding
相关产品推荐
相关产品推荐

