Python 使用计数器聚合值

Python 使用计数器聚合值,python,Python,是否有一种方法可以使用计数器聚合列表中每个条目的值,而不仅仅计算条目出现的时间 例如,如果我有一个列表 from collections import Counter lst = [ ['John', 1], ['James', 2], ['John', 3], ['Andy', 1] ] 我也是 total = Counter(name for name, num in lst) print(total) 输出将是 Counter({'John': 2,

是否有一种方法可以使用
计数器
聚合列表中每个条目的值,而不仅仅计算条目出现的时间

例如,如果我有一个列表

from collections import Counter

lst = [
    ['John', 1],
    ['James', 2],
    ['John', 3],
    ['Andy', 1]
]
我也是

total = Counter(name for name, num in lst)
print(total)
输出将是

Counter({'John': 2, 'James': 1, 'Andy': 1})
这是意料之中的。我只是想知道有没有办法

Counter({'John': 4, 'James': 2, 'Andy': 1})

我知道有很多方法可以做到这一点,但我正在寻找一种使用
计数器
的方法。您可以使用一个简单的循环来添加值:

total = Counter()
for name, num in lst:
    total[name] += num

print(total)  # -> Counter({'John': 4, 'James': 2, 'Andy': 1})

如果有一种方法可以在O(n)中的一行中实现这一点,我很想知道。

您需要在列表中循环,并相应地更新计数器

c = Counter()

for k, v in lst:
    c.update({k: v})

>>> print(c)
Counter({'John': 4, 'James': 2, 'Andy': 1})
您也可以使用列表理解,但是:


输出是相同的。

将另一级别的for循环添加到发布的列表中

total = Counter(name for name, num in lst for _ in range(num))

print(total)
# Output: Counter({'John': 4, 'James': 2, 'Andy': 1})

循环遍历各个元素并返回总和。您可以使用列表理解方式:[c.update({k:v})for k,v in lst]其中c=Counter()。刚刚测试过,它可以工作:)@Djerro那还是两行。我的意思是创建
计数器
,并在一行中全部更新。不管怎样,第一种方法是好的,第二种方法不是。(我回复了你的评论,但在这里也提到了这一点,以提高知名度。)是的,列表上的观点是正确的。当我想到它时,感觉有点像黑客,谢谢你的链接!我喜欢它在一行中的表现,但是如果列表(尤其是数字)变得非常大,它可能会变得非常昂贵,因为它现在基本上会将John的名字返回4次,而不是用额外的计数3来更新key John。@Djeroneth--同意。与使用每个名称、值对更新计数器相比,此方法(1)与发布的情况一样,仅使用几个元素时速度稍快,(2)与几十个元素相当,(3)与数百个或更多元素时速度慢得多。这是基于计时测试。为什么它会连续4次返回John的名字?我可能遗漏了一些基本原理。感谢您提供了许多关于执行时间的答案和详细信息。@LukeB--这是因为uuin range(num)
的内部循环
。所以
打印([name for name,num in lst for uu in range(num)])
输出
['John','James','James','John','John','John','Andy']
。因此,该列表的计数器(..)提供了所需的结果。注意:区别在于我提供了一个生成器来计数器,而不是一个列表,但结果相同。
total = Counter(name for name, num in lst for _ in range(num))

print(total)
# Output: Counter({'John': 4, 'James': 2, 'Andy': 1})