繁体   English   中英

如何计算列表中唯一列表的数量?

[英]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})

如果确实在子列表列表中嵌套了其他不可使用的类型,请使用strrepr方法,因为该方法也可以处理所有子列表。 或将所有递归转换为元组(更多工作)。

我认为,在类似的元组上使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM