我尝试过使用Counter和itertools,但由于列表不可用,它们不起作用。
我的数据如下:[[1,2,3],[2,3,4],[1,2,3]]
我想知道列表[1,2,3]出现两次,但我无法弄清楚如何做到这一点。我想把每个列表转换成一个元组,然后用它进行散列。还有更好的方法吗?
答案 0 :(得分:6)
>>> from collections import Counter
>>> li=[ [1,2,3], [2,3,4], [1,2,3] ]
>>> Counter(str(e) for e in li)
Counter({'[1, 2, 3]': 2, '[2, 3, 4]': 1})
只要每个子列表中没有嵌套的可变项(例如[ [1,2,3], [2,3,4,[11,12]], [1,2,3] ]
:
>>> Counter(tuple(e) for e in li)
Counter({(1, 2, 3): 2, (2, 3, 4): 1})
如果您确实在子列表列表中嵌套了其他不可用类型,请使用str
或repr
方法,因为它也会处理所有子列表。或者递归地将所有转换为元组(更多工作)。
答案 1 :(得分:2)
我认为,在
这样的元组上使用Counter
类
Counter(tuple(item) for item in li)
在优雅和“pythoniticity”方面将是最佳的:它可能是最短的解决方案,它非常清楚你想要实现什么以及它是如何完成的,并且它使用了resp。结合标准方法(从而避免重新发明轮子)。
我能看到的唯一性能缺点是,每个元素都必须转换为元组(为了可以删除),这或多或少意味着所有子列表的所有元素都必须被复制一次。如果你知道列表元素将是例如,那么元组的内部哈希函数可能是次优的。总是整数。
为了提高性能,你必须
Counter
类以便使用此哈希算法并提供一些合适的输出(此类可能使用字典作为键使用哈希值以及“原始”列表和计数的组合作为价值)至少第一步需要在C / C ++中完成,以匹配内部哈希函数的速度。如果您知道列表元素的类型,您甚至可以提高性能。
至于Counter
类,我不知道它的标准实现是在Python还是在C中,如果是后者,你可能还需要在C中重新实现它以实现相同的目的(或更好)表现。
因此,如果不了解您的具体要求,就无法回答(有没有更好的解决方案)问题。
答案 2 :(得分:1)
ll = [ [1,2,3], [2,3,4], [1,2,3] ]
print(len(set(map(tuple, ll))))
另外,如果您想计算唯一*列表的出现次数:
print(ll.count([1,2,3]))
*值唯一,不是唯一参考)
答案 3 :(得分:0)
list = [ [1,2,3], [2,3,4], [1,2,3] ]
repeats = []
unique = 0
for i in list:
count = 0;
if i not in repeats:
for i2 in list:
if i == i2:
count += 1
if count > 1:
repeats.append(i)
elif count == 1:
unique += 1
print "Repeated Items"
for r in repeats:
print r,
print "\nUnique items:", unique
遍历列表以查找重复序列,同时跳过已经检测为重复的项目,并将它们添加到repeats
列表中,同时计算唯一列表的数量。