[英]How to count number of unique lists within list?
我尝试使用Counter和itertools,但是由于列表不可用,因此它们无法正常工作。
我的数据如下所示:[[1,2,3],[2,3,4],[1,2,3]]
我想知道列表[1,2,3]出现了两次,但是我不知道该怎么做。 我当时只是想将每个列表转换为一个元组,然后对其进行哈希处理。 有没有更好的办法?
>>> 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
方法,因为该方法也可以处理所有子列表。 或将所有递归转换为元组(更多工作)。
我认为,在类似的元组上使用Counter
类
Counter(tuple(item) for item in li)
在优雅和“ pythoniticity”方面将是最佳的:这可能是最短的解决方案,它非常清楚您想要实现什么以及如何实现,并且使用了resp。 结合了标准方法(因此避免了重新发明轮子)。
我可以看到的唯一性能缺陷是,每个元素都必须转换为元组(以便可哈希化),这或多或少意味着所有子列表的所有元素都必须复制一次。 同样,如果您知道列表元素将始终为整数,则元组的内部哈希函数可能不是最佳的。
为了提高性能,您必须
Counter
类,以便使用此哈希算法并提供一些合适的输出(此类可能会使用字典,其中使用哈希值作为键,并使用“原始”列表和count的组合作为值) 为了匹配内部哈希函数的速度,至少需要在C / C ++中完成第一步。 如果您知道列表元素的类型,则可能甚至可以提高性能。
至于Counter
类,我不知道它的标准实现是在Python中还是在C中,如果是后者,那么您可能还必须在C中重新实现它才能获得相同(或更好)的性能。
因此,在不知道您的具体要求的情况下(总是)无法回答“是否有更好的解决方案”的问题。
ll = [ [1,2,3], [2,3,4], [1,2,3] ]
print(len(set(map(tuple, ll))))
另外,如果您要计算唯一*列表的出现次数:
print(ll.count([1,2,3]))
*值唯一,而不是参考唯一)
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
列表中,同时计算唯一列表的数量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.