27

我对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
4

3 回答 3

46

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

于 2013-04-15T11:01:27.060 回答
6

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

@eurmiro 的回答向您展示了如何使用Counter(这是最好的方法!),但这里有一个穷人的版本来说明如何Counter使用字典以及dict.get(k, [,d])尝试获取密钥(k)的方法,但如果它没有t 存在它返回默认值而不是 ( 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}
于 2013-04-15T11:11:06.323 回答
2

我需要一些 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}
于 2019-01-24T06:49:57.013 回答