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的计数总和.
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)