如何高效统计嵌套字典中各子字典对应的父键数量?
高效统计嵌套字典中子字典的父键数量
这个场景我之前处理过,核心卡点在于字典是不可哈希类型,所以直接把子字典丢给collections.Counter肯定行不通——毕竟Counter的键必须是能被哈希的对象。不过只要把子字典转换成可哈希的格式,问题就迎刃而解了。
解决方案思路
把每个子字典转换成排序后的键值对元组:
- 元组是可哈希的,能直接作为Counter的统计键
- 排序是为了避免子字典键顺序不同导致误判(比如
{1:1,2:2}和{2:2,1:1}本质是同一个字典,排序后生成的元组完全一致)
代码实现
from collections import Counter products = { 1: {1:1, 2:2, 3:3}, 2: {1:1, 2:2, 3:3}, 3: {1:1, 2:2, 3:3}, 4: {1:2, 2:3, 3:4} } # 遍历所有子字典,转成排序后的键值对元组,用Counter统计 sub_dict_counts = Counter(tuple(sorted(sub.items())) for sub in products.values()) # 如果你需要把结果转回字典格式展示(可选) result = {dict(sub_tuple): count for sub_tuple, count in sub_dict_counts.items()} # 输出结果 for sub_dict, count in result.items(): print(f"{sub_dict}: {count}")
为什么这方法高效?
- 只需要一次遍历所有父键对应的子字典,时间复杂度是
O(n * m log m):其中n是父键数量(10000+),m是子字典的键数量。这个复杂度对于10000+的数据来说非常友好,远优于双重循环的O(n²)。 - 完全利用了Counter的高效统计能力,不需要自己写复杂的比较逻辑。
补充说明
你之前尝试用Counter失败,就是因为直接传了不可哈希的字典;用列表存储也没用,因为列表同样不可哈希。把字典转成排序后的元组,既保留了所有数据信息,又满足了哈希要求,完美解决问题。
内容的提问来源于stack exchange,提问作者ask0ne
相关产品推荐
相关产品推荐

