使用过滤器为元组列表添加类似的值

时间:2018-03-27 03:22:06

标签: python python-3.x

我有这个清单

order = [('5464', 39.96), ('8274', 233.82), ('9744', 404.55), 
         ('5464', 89.91), ('9744', 404.55), ('5464', 89.91), 
         ('88112', 274.89), ('8732', 83.93), ('7733', 208.89), ('88112', 199.75)]

它基本上是一个图书订单编号列表和总数。我想使用filter,map,lambda和reduce来获取一个元组列表,它将添加类似的图书订单号的值,这样它就会返回一个包含7个元组的列表。

2 个答案:

答案 0 :(得分:0)

这是我能做的最好的,虽然可能有更好的方法来做,也许最好的方法是使用字典,我希望这无论如何都有帮助

print(list(set(map(lambda x: (x[0],sum(map(lambda y:   y[1] if x[0] == y[0] else 0,order) )),order)) ) )

<强>输出

[('9744', 809.1), ('88112', 474.64), ('5464', 219.78), ('8274', 233.82), ('8732', 83.93), ('7733', 208.89)]

答案 1 :(得分:0)

您可以尝试使用lambda:

的itertools
import itertools

order = [('5464', 39.96), ('8274', 233.82), ('9744', 404.55),
         ('5464', 89.91), ('9744', 404.55), ('5464', 89.91),
         ('88112', 274.89), ('8732', 83.93), ('7733', 208.89), ('88112', 199.75)]


print(list(map(lambda m:(m[0],sum(map(lambda xa:xa[1],m[1]))),itertools.groupby(sorted(order),key=lambda x:x[0]))))

输出:

[('5464', 219.78), ('7733', 208.89), ('8274', 233.82), ('8732', 83.93), ('88112', 474.64), ('9744', 809.1)]

如果你想使用reduce功能,那么:

print(list(map(lambda x:(x[0],functools.reduce(lambda x,y:x+y,list(map(lambda x:x[1],list(x[1]))))),itertools.groupby(sorted(order),key=lambda x:x[0]))))