Python:统计字典各键对应列表的索引唯一元组数量
高效处理字典中同索引元组的唯一性计数
问题描述
给定如下结构的字典:
lists_dict = { 1: [('64', 'R'), ('0', 'n'), ('0', 'M')], 2: [('64', 's'), ('0', 'r'), ('0', 'M')], 3: [('64', 'R'), ('0', 'n'), ('0', 'M')], 4: [('64', 'I'), ('0', 'S'), ('0', 'N')] }
需求:对比各列表同索引位置的元组,若某个元组在其他所有列表的同索引位置都不存在,则为对应键的计数加1。最终输出每个键对应的原列表及计数,示例输出如下:
1: [('64', 'R'), ('0', 'n'), ('0', 'M')],0 #(no unique) 2: [('64', 's'), ('0', 'r'), ('0', 'M')],2 #(two unique tuples) 3: [('64', 'R'), ('0', 'n'), ('0', 'M')],0 #(no unique) 4: [('64', 'I'), ('0', 'S'), ('0', 'N')], 3 #(unique, no other list have these values)
实际场景中,字典包含400个键,每个列表有22个二元元组,需要高效替代两两遍历的低效方案。
高效解决方案
核心思路是先全局统计每个索引位置下各元组的出现次数,再基于统计结果快速计算每个键的唯一元组计数,避免两两对比的高复杂度。
实现代码
from collections import Counter def count_unique_tuples(lists_dict): # 1. 按索引位置分组所有元组,统计每个索引下元组的出现次数 index_tuple_counts = [] for index_group in zip(*lists_dict.values()): count = Counter(index_group) index_tuple_counts.append(count) # 2. 遍历每个键,计算唯一元组的数量 result = {} for key, tuples_list in lists_dict.items(): unique_count = 0 for idx, tpl in enumerate(tuples_list): if index_tuple_counts[idx][tpl] == 1: unique_count += 1 result[key] = (tuples_list, unique_count) # 3. 按示例格式输出 for key, (tpl_list, cnt) in result.items(): comment = f"({cnt} unique tuple{'s' if cnt !=1 else ''})" if cnt else "(no unique)" print(f"{key}: {tpl_list},{cnt} #{comment}") # 测试示例 lists_dict = { 1: [('64', 'R'), ('0', 'n'), ('0', 'M')], 2: [('64', 's'), ('0', 'r'), ('0', 'M')], 3: [('64', 'R'), ('0', 'n'), ('0', 'M')], 4: [('64', 'I'), ('0', 'S'), ('0', 'N')] } count_unique_tuples(lists_dict)
效率说明
- 时间复杂度:O(NK),其中N是字典键的数量(400),K是每个列表的元组数量(22)。全局统计和后续遍历各占一次O(NK),远优于两两对比的O(N²K)(400²22=3,520,000 vs 400222=17,600)。
- 空间复杂度:O(KN),用于存储每个索引的元组计数,对于40022的规模完全可控。
内容的提问来源于stack exchange,提问作者rand_coder123
相关产品推荐
相关产品推荐

