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

mac*_*erk 19 python tuples list counting

我是python的新手,但我无法在任何地方找到解决问题的方法.

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

这是元组列表:

list1 = [
         ('12392', 'some string', 'some other string'),
         ('12392', 'some new string', 'some other string'),
         ('7862', None, 'some other string')
        ]
Run Code Online (Sandbox Code Playgroud)

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

for entry in list1:
    print list1.count(entry[0])
Run Code Online (Sandbox Code Playgroud)

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

2
1
Run Code Online (Sandbox Code Playgroud)

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

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

for name, value in list1:

    if value > 1:
        print value
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ValueError: Too many values to unpack
Run Code Online (Sandbox Code Playgroud)

eum*_*iro 35

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

from collections import Counter
Counter(elem[0] for elem in list1)
Run Code Online (Sandbox Code Playgroud)

回报

Counter({'12392': 2, '7862': 1})
Run Code Online (Sandbox Code Playgroud)

它很快,因为它只在你的列表上迭代一次.您迭代条目,然后尝试在列表中计算这些条目.这不能用.count,但可能如下:

for entry in list1:
    print sum(1 for elem in list1 if elem[0] == entry[0])
Run Code Online (Sandbox Code Playgroud)

但说真的,看看吧collections.Counter.

编辑:我实际上需要值大于1的条目总数.

你仍然可以使用Counter:

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

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


jam*_*lak 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}
Run Code Online (Sandbox Code Playgroud)