python内置于reducebykey

时间:2015-06-13 14:35:13

标签: python python-2.7

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()函数最终只是将所有元组一起迭代,并没有实际组合键。有什么方法吗?

4 个答案:

答案 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