计算元组列表中的出现次数

时间:2013-04-15 10:59:41

标签: python list tuples counting

我对python很新,但我无法在任何地方找到解决问题的方法。

我想计算元组列表中字符串的出现次数。

以下是元组列表:

list1 = [
         ('12392', 'some string', 'some other string'),
         ('12392', 'some new string', 'some other string'),
         ('7862', None, 'some other string')
        ]

我试过这个,但它只打印0

for entry in list1:
    print list1.count(entry[0])

由于同一ID在列表中出现两次,因此应返回:

2
1

我还试图为每次出现相同ID的人增加一个计数器,但却无法完全掌握如何编写它。

*编辑: 使用Eumiro的精彩答案。我才意识到我没有解释整个问题。 我实际上需要值大于1的条目总数。但是如果我尝试这样做:

for name, value in list1:

    if value > 1:
        print value

我收到此错误:

ValueError: Too many values to unpack

3 个答案:

答案 0 :(得分:32)

也许collections.Counter可以解决您的问题:

from collections import Counter
Counter(elem[0] for elem in list1)

返回

Counter({'12392': 2, '7862': 1})

它很快,因为它只在你的列表上迭代一次。您迭代条目,然后尝试在列表中计算这些条目。使用.count无法做到这一点,但可能会按如下方式完成:

for entry in list1:
    print sum(1 for elem in list1 if elem[0] == entry[0])

但严重的是,请查看collections.Counter

编辑我实际上需要的值总数超过1的条目。

您仍然可以使用Counter

c = Counter(elem[0] for elem in list1)
sum(v for k, v in c.iteritems() if v > 1)

返回2,即高于1的计数总和。

答案 1 :(得分:4)

list1.count(entry[0])无效,因为它会查看list1中的三个元组中的每一个,例如。 ('12392', 'some string', 'some other string')并检查它们是否等于'12392',这显然不是这种情况。

@ eurmiro的答案向您展示了如何使用Counter(这是最好的方式!),但是这是一个穷人的版本来说明Counter如何使用字典和{{1}将尝试获取密钥(dict.get(k, [,d]))的方法,但如果它不存在则返回默认值(k):

d

答案 2 :(得分:1)

我需要Counter所没有的一些额外功能。我有一个元组列表,第一个元素是键,第二个元素是要添加的量。 @jamylak解决方案对此非常适合!

>>> list = [(0,5), (3,2), (2,1), (0,2), (3,4)]

>>> d = {}
>>> for x, y in list1:
    d[x] = d.get(x, 0) + y

>>> d
{0: 7, 2: 1, 3: 6}