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

时间:2014-08-12 02:23:51

标签: python list

我尝试过使用Counter和itertools,但由于列表不可用,它们不起作用。

我的数据如下:[[1,2,3],[2,3,4],[1,2,3]]

我想知道列表[1,2,3]出现两次,但我无法弄清楚如何做到这一点。我想把每个列表转换成一个元组,然后用它进行散列。还有更好的方法吗?

4 个答案:

答案 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})

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

答案 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列表中,同时计算唯一列表的数量。