如何高效统计模拟生成的多层嵌套字典中重复列表占比?
解决大型字典中重复列表占比统计问题
问题描述
给定嵌套字典结构,需统计每个字母键(如a、b)下各子键对应的列表集合中,完整重复列表的占比。数据量约70万个列表,要求处理高效,同时避免转字符串的歧义问题,且Counter无法直接处理列表、Pandas的explode+count方案不适用。
字典结构示例:
my_dict = { 'a': { 1: [[1,2,3], [1,2,3], [1,2,3], [1,3,5]], 2: [[2,44,57,18], [2,44,57,18], [2,44,57,23], [2,44,57,23]]}, 'b': { 3: [[3,67,50], [3,67,50], [3,36]], 4: [[4,12,34], [4,12]]}}
解决方案
核心思路
由于列表不可哈希,无法直接作为Counter的键,选择将列表转换为元组(元组可哈希、转换无歧义且效率极高),再用Counter统计重复次数,最后计算占比。
代码实现
from collections import Counter # 示例字典(实际替换为你的大型字典) my_dict = { 'a': { 1: [[1,2,3], [1,2,3], [1,2,3], [1,3,5]], 2: [[2,44,57,18], [2,44,57,18], [2,44,57,23], [2,44,57,23]]}, 'b': { 3: [[3,67,50], [3,67,50], [3,36]], 4: [[4,12,34], [4,12]]}} # 存储最终结果 result = {} # 遍历外层字母键 for letter_key, sub_dict in my_dict.items(): result[letter_key] = {} # 遍历内层数字键 for num_key, lists in sub_dict.items(): # 将列表转换为元组(可哈希,用于Counter统计) tuple_list = [tuple(lst) for lst in lists] # 统计每个元组的出现次数 count_stats = Counter(tuple_list) total_lists = len(tuple_list) # 计算每个重复列表的占比(仅保留出现次数>1的项) duplicate_item_ratios = {list(tpl): cnt / total_lists for tpl, cnt in count_stats.items() if cnt > 1} # 计算整体重复列表的占比(所有重复项的总出现数/总列表数) overall_duplicate_ratio = sum(cnt for cnt in count_stats.values() if cnt > 1) / total_lists # 存入结果字典 result[letter_key][num_key] = { "各重复列表占比": duplicate_item_ratios, "整体重复占比": overall_duplicate_ratio } # 打印结果示例 for letter, sub_result in result.items(): print(f"字母键 {letter}:") for num, ratios in sub_result.items(): print(f" 数字键 {num}:") print(f" 各重复列表占比: {ratios['各重复列表占比']}") print(f" 整体重复占比: {ratios['整体重复占比']:.2%}")
方案优势
- 高效性:列表转元组和
Counter统计均为O(n)时间复杂度,处理70万列表无性能压力; - 无歧义:元组与列表结构完全对应,不会出现转字符串时的格式冲突问题;
- 灵活性:可同时获取单个重复列表的占比和整体重复占比,满足不同统计需求。
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

