不会比这更简单,我想:a=[("13.5",100)]
b=[("14.5",100), ("15.5", 100)]
c=[("15.5",100), ("16.5", 100)]
input=[a,b,c]
from collections import Counter
print sum(
(Counter(dict(x)) for x in input),
Counter())
请注意,Counter(也称为multiset)是数据的最自然的数据结构(一种类型的集合,元素可以属于该集合不止一次,或者等价于一个具有语义元素-gt;OccurrenceCount的映射)。你本来可以用它来代替元组列表的。
也可能:from collections import Counter
from operator import add
print reduce(add, (Counter(dict(x)) for x in input))
使用reduce(add, seq)而不是sum(seq, initialValue)通常更灵活,允许跳过传递多余的初始值。
注意,您还可以使用operator.and_来查找多集的交集,而不是求和。
上面的变体非常慢,因为每一步都会创建一个新的计数器。我们来解决这个问题。
我们知道Counter+Counter返回一个包含合并数据的新Counter。这是可以的,但我们想避免额外的创造。我们改用Counter.update:update(self, iterable=None, **kwds) unbound collections.Counter method
Like dict.update() but add counts instead of replacing them.
Source can be an iterable, a dictionary, or another Counter instance.
这就是我们想要的。让我们用一个与reduce兼容的函数包装它,看看会发生什么。def updateInPlace(a,b):
a.update(b)
return a
print reduce(updateInPlace, (Counter(dict(x)) for x in input))
这只比OP的解决方案慢一点。
基准:http://ideone.com/7IzSx(使用另一个解决方案进行更新,这要感谢astymax)
(还有:如果你非常想要一个一行程序,你可以用lambda x,y: x.update(y) or x来替换updateInPlace,它的工作方式是相同的,甚至比原来快了一瞬间,但是在可读性上失败了。不要:-)