Python中如何统计列表内重复的子列表?
解决包含双元组的子列表重复统计问题
嘿,我完全懂你现在的困扰——你想要统计的是每个包含两个元组的子列表的重复次数,但之前直接用Counter(Gn)的方式失效了,输出结果反而统计了单个元组的出现次数,这显然不是你要的效果对吧?
问题根源
问题出在列表的可哈希性上:Counter的底层是字典,而字典的键必须是可哈希的不可变类型。你列表中的每个元素是[(1,2,3,4),(3,4,2,1)]这样的子列表,列表是可变类型,无法被哈希,所以Counter没法直接把它当作键来统计。之前的输出其实是把所有子列表里的元组都拆出来单独统计了,这就偏离了你的需求。
解决方案:将子列表转为可哈希的元组
只需要把每个子列表转换成元组(元组是不可变可哈希的),就能让Counter正常工作了。修改后的代码如下:
from collections import Counter Gn = MHs1(phi) # 将每个子列表转换为元组,使其成为可哈希对象 hashable_gn = [tuple(sublist) for sublist in Gn] # 现在Counter可以正确统计子列表的重复次数了 n = dict(Counter(hashable_gn)) print(n)
额外优化:如果元组顺序不影响重复判断
如果你认为[(1,2,3,4),(3,4,2,1)]和[(3,4,2,1),(1,2,3,4)]是同一个重复项,那可以先对子列表里的元组排序,再转成元组,这样就能把顺序不同但内容一致的子列表归为一类:
from collections import Counter Gn = MHs1(phi) # 先排序子列表内的元组,再转成元组 hashable_gn = [tuple(sorted(sublist)) for sublist in Gn] n = dict(Counter(hashable_gn)) print(n)
这样运行后,输出的键就是((1,2,3,4),(3,4,2,1))这类的双元组结构,对应的值就是该子列表的重复次数,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Liwei Xu
相关产品推荐
相关产品推荐

