如何统计列表中无序元组组合的出现次数
解决无方向元组组合的统计问题
嘿,这个需求太常见啦——处理无方向的连接关系时,确实得把(a,b)和(b,a)当成同一个组合来统计。我给你两个简洁的解决方案,都是Python里常用的思路:
方法一:用collections.Counter(最省心的写法)
这是最简洁的实现方式,核心思路是把每个元组转换成排序后的不可变结构(因为字典/计数器的key必须可哈希),这样不管元组元素顺序如何,都会被归为同一个统计key,再用Counter自动完成计数。
from collections import Counter my_list = [(1,12),(12,1),(12,1),(20,15),(7,8),(15,20)] # 对每个元组排序后转成tuple,作为Counter的统计key pair_counts = Counter(tuple(sorted(pair)) for pair in my_list) # 按你想要的格式输出结果 for sorted_pair, count in pair_counts.items(): print(f"{sorted_pair[0]},{sorted_pair[1]} = {count}")
运行后会直接输出你期望的结果:
1,12 = 3 20,15 = 2 7,8 = 1
方法二:手动用字典计数(适合理解底层逻辑)
如果不想依赖Counter,用普通字典手动维护计数也很简单,逻辑和上面完全一致:
my_list = [(1,12),(12,1),(12,1),(20,15),(7,8),(15,20)] count_dict = {} for pair in my_list: # 生成排序后的元组作为唯一标识key key = tuple(sorted(pair)) # 更新计数:存在则加1,不存在就初始化为1 count_dict[key] = count_dict.get(key, 0) + 1 # 格式化输出结果 for sorted_pair, count in count_dict.items(): print(f"{sorted_pair[0]},{sorted_pair[1]} = {count}")
小补充
这个思路适用于所有元素可排序、可哈希的元组(比如整数、字符串、浮点数这些),如果你的元组里是更复杂的对象,只要能实现排序逻辑,同样可以用这个方法哦~
内容的提问来源于stack exchange,提问作者neural_nomad




