python中是否有内置的reducebykey功能?如果没有,我该如何模仿这个功能?
例如,如果我正在做一个简单的字数:
>>> x=[('a', 1), ('a', 1), ('b', 1), ('c', 1)]
>>> reduce(lambda a,b:a+b, x)
('a', 1, 'a', 1, 'b', 1, 'c', 1)
我想要的是让它返回[('a',2),('b',1),('c',1)]。但是reduce()函数最终只是将所有元组一起迭代,并没有实际组合键。有什么方法吗?
答案 0 :(得分:3)
您可以使用 OrderedDict 。它也会保留订单。
from collections import OrderedDict
result = OrderedDict()
for item in x:
result[item[0]] = result.get(item[0], 0) + item[1]
result
[('a', 2), ('b', 1), ('c', 1)]
在这里,我们正在迭代字典。我们在item[0]
ordereddict中寻找密钥result
。如果找到了,那么我们将item[1]
添加到我们已经存在的值中,在我们的情况下为1。否则,我们将默认值设为0,然后添加item[1]
(这将在第一次遇到元素时发生)。
答案 1 :(得分:2)
作为一种更有效的方式,您可以使用collections.defaultdict
:
>>> x=[('a', 1), ('a', 1), ('b', 1), ('c', 1)]
>>>
>>> from collections import defaultdict
>>> d=defaultdict(int)
>>> for i,j in x:
... d[i]+=j
...
>>> d.items()
[('a', 2), ('c', 1), ('b', 1)]
请注意,这不会保留订单,如果您关心,可以使用collections.OrderedDict
defaultdict
的内容。
答案 2 :(得分:1)
from collections import defaultdict
x = [('a', 1), ('a', 1), ('b', 1), ('c', 1)]
d = defaultdict(int)
for a,b in x:
d[a] += b
print(d.items())
或保证您保持订单使用OrderedDict:
from collections import OrderedDict
x = [('a', 1), ('a', 1), ('b', 1), ('c', 1)]
d = OrderedDict()
for a,b in x:
d.setdefault(a,0)
d[a] += b
print(list(d.items()))
[('a', 2), ('b', 1), ('c', 1)]
答案 3 :(得分:1)
使用字典计算相同的键:
from collections import defaultdict
x=[('a', 1), ('a', 1), ('b', 1), ('c', 1)]
result = defaultdict(lambda: 0)
for k, v in x:
result[k] += v