我对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
答案 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}