python reduce函数怎么用的_我如何仅通过使用reduce函数在python中创建单...

元组列表整合方法
本文介绍了两种处理元组列表的有效方法:使用collections.Counter统计相同类型元素的出现次数,并利用itertools.groupby对排序后的列表按名称分组并求和。这两种方法能够解决reduce函数难以处理的问题。

使用reduce似乎很难实现,因为如果您“ reduce”的两个元组都没有相同的字母,那么您将无法计算结果.如何减少(‘a’,1)和(‘b’,1)到可行的结果?

我能做的最好是l = functools.reduce(lambda x,y:(x [0],x [1] y [1])如果x [0] == y [0]否则x y,sorted(l))

它给了我(‘a’,3,’b’,1,’c’,1,’c’,1).因此,它对于第一个元素来说有点奏效,但需要多次通过才能进行其他操作(重新创建元组并进行另一次类似的减少,至少可以说这不是很有效!).

无论如何,这里有2种可行的方法

首先,使用collections.Counter计数相同类型的元素:

l = [('a', 1), ('a', 1), ('b', 1), ('c',1), ('a', 1), ('c', 1)]

import collections

c = collections.Counter()

for a,i in l:

c[a] += i

我们不能使用listcomp,因为每个元素都有权重(即使此处为1)

结果:一个字典:Counter({‘a’:3,’c’:2,2,’b’:1})

第二种选择:在排序列表上使用itertools.groupby,按名称/字母分组,并对带有相同字母的整数求和:

print ([(k,sum(e for _,e in v)) for k,v in itertools.groupby(sorted(l),key=lambda x : x[0])])

结果:

[('a', 3), ('b', 1), ('c', 2)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值