我有这个清单
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个元组的列表。
答案 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:
的itertoolsimport 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]))))