python内置reducebykey

2024-09-28 23:40:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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()函数只是遍历了所有元组,实际上并没有组合键。有办法吗?你知道吗


Tags: lambda函数功能reduce内置元组办法组合键
3条回答

作为一种更有效的方法,您可以使用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.OrderedDictintead of defaultdict。你知道吗

您可以使用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)]

在这里,我们正在迭代字典。我们在resultordereddict中查找键item[0]。如果找到了,那么我们将item[1](在我们的例子中是1)加到已经存在的值上。否则,我们将默认值设为0,然后添加item[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

相关问题 更多 >