在一个元组列表中计算出现次数

28

我对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个回答

47

也许 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的计数之和。


“Counter” 让它变得如此简单。 - jamylak
谢谢!这真的很简单!我刚意识到我没有解释整个问题。我更新了原始问题。 - mackwerk
@eumiro - 太棒了!非常感谢!你在做的那些东西叫做推导,对吗? - mackwerk
@Mackwerk - 确切地说,这是一个生成器推导式 - eumiro
在Python 3中,c.iteritems()需要被替换为c.items() - micmalti

7
list1.count(entry[0])无法正常工作,因为它查看list1中的三个元组,例如('12392','some string','some other string'),并检查它们是否等于例如'12392',显然不是这种情况。
@eurmiro的答案向您展示了如何使用Counter(这是最佳方法!),但这里是一个穷人版,以说明Counter如何使用字典和dict.get(k[,d])方法,该方法将尝试获取一个键(k),但如果不存在,则返回默认值(d):
>>> list1 = [
         ('12392', 'some string', 'some other string'),
         ('12392', 'some new string', 'some other string'),
         ('7862', None, 'some other string')
]
>>> d = {}
>>> for x, y, z in list1:
        d[x] = d.get(x, 0) + 1


>>> d
{'12392': 2, '7862': 1}

2

我需要一些计数器没有的额外功能。我有一个元组列表,第一个元素是键,第二个元素是要添加的数量。@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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接