Python统计哈希字典值出现频次及对应关联键实现方法
Python字典值列表元素统计方案
原始数据
data = {112: [25083], 25091: [6939], 32261: [9299, 6939, 3462], 32934: [7713, 6762, 6939], 34854: [6939], 56630: [7713]}
需求说明
需要实现两类统计结果:
- 格式1:统计所有值列表内元素的出现频次,输出结构为
{值元素: 出现次数} - 格式2:反向映射每个值元素对应的所属原字典键,输出结构为
{值元素: [包含该值的原键列表]}
注:你给出的第二个输出示例中
25083:[25083]为笔误,根据原始数据,25083是键112对应的值,正确映射应为25083:[112]
问题代码错误点
你之前写的代码核心错误是k.setdefault(i, set()).add(k):这里add传入的k是整个统计字典本身,不是当前遍历的原字典键,同时用set存储也不符合输出需要列表的要求。
正确实现代码
方案1:使用collections工具类(写法最简洁)
from collections import defaultdict, Counter # 1. 统计值元素出现频次 # 展开所有值列表为一维序列,用Counter直接统计,按频次降序排序匹配示例顺序 count_result = dict(sorted( Counter(v for val_list in data.values() for v in val_list).items(), key=lambda x: -x[1] )) # 2. 构建值到所属键的反向映射 key_map_result = defaultdict(list) for origin_key, val_list in data.items(): for v in val_list: key_map_result[v].append(origin_key) # 同样按对应键的数量降序排序,匹配示例顺序 key_map_result = dict(sorted( key_map_result.items(), key=lambda x: -len(x[1]) )) # 打印结果 print(count_result) print(key_map_result)
方案2:纯原生Python实现(无需导入额外模块)
# 1. 频次统计 count_result = {} for val_list in data.values(): for v in val_list: count_result[v] = count_result.get(v, 0) + 1 # 按频次降序排序 count_result = dict(sorted(count_result.items(), key=lambda x: -x[1])) # 2. 反向键映射 key_map_result = {} for origin_key, val_list in data.items(): for v in val_list: if v not in key_map_result: key_map_result[v] = [] key_map_result[v].append(origin_key) # 按映射列表长度降序排序 key_map_result = dict(sorted(key_map_result.items(), key=lambda x: -len(x[1])))
运行输出结果
- 频次统计结果(完全匹配你给出的预期示例):
{6939: 4, 7713: 2, 25083: 1, 9299: 1, 3462: 1, 6762: 1}
- 值-键映射结果:
{6939: [25091, 32261, 32934, 34854], 7713: [32934, 56630], 25083: [112], 9299: [32261], 3462: [32261], 6762: [32934]}
内容的提问来源于stack exchange,提问作者Ebone22
相关产品推荐
相关产品推荐

