如何更简洁地提取Python字典中值相同的所有键?
提取字典中值相同的键:更简洁的实现方式
你当前的代码可以实现需求,但存在多次遍历字典的问题,效率较低。下面是两种更简洁高效的实现方式:
原代码及输出
b = {'a1': ['b1', 'b2', 'b3'], 'a2': ['b1', 'b2', 'b3'], 'a3': ['b4', 'b5', 'b6'], 'a4': ['b4', 'b5', 'b6'] } c = [] for i in b.values(): if i not in c: c.append(i) f = list() for i in c: print(i) e = [k for k, v in b.items() if v == i] print(e) f.append((i, e)) print(f)
运行输出:
[(['a1', 'a2'], ['b1', 'b2', 'b3']), (['a3', 'a4'], ['b4', 'b5', 'b6'])]
优化方案1:使用collections.defaultdict
借助defaultdict可以快速构建“值-键列表”的映射,只需遍历一次字典:
from collections import defaultdict b = {'a1': ['b1', 'b2', 'b3'], 'a2': ['b1', 'b2', 'b3'], 'a3': ['b4', 'b5', 'b6'], 'a4': ['b4', 'b5', 'b6'] } # 因为列表不可哈希,转成tuple作为字典键 value_key_map = defaultdict(list) for key, val in b.items(): value_key_map[tuple(val)].append(key) # 转换为你需要的格式 result = [(list(val), keys) for val, keys in value_key_map.items()] print(result)
优化方案2:不依赖额外库,用普通字典
如果不想引入collections,用普通字典也能实现:
b = {'a1': ['b1', 'b2', 'b3'], 'a2': ['b1', 'b2', 'b3'], 'a3': ['b4', 'b5', 'b6'], 'a4': ['b4', 'b5', 'b6'] } value_key_map = {} for key, val in b.items(): val_tuple = tuple(val) if val_tuple not in value_key_map: value_key_map[val_tuple] = [] value_key_map[val_tuple].append(key) result = [(list(val), keys) for val, keys in value_key_map.items()] print(result)
说明
- 原代码需要多次遍历字典,时间复杂度为O(n²);优化后的方法仅遍历一次字典,时间复杂度为O(n),数据量大时效率提升明显。
- 如果你的字典值本身是可哈希类型(如字符串、数字、元组),可以直接用值作为字典键,无需转换为
tuple。
内容的提问来源于stack exchange,提问作者Vijay
相关产品推荐
相关产品推荐

