这里如何使用reduce功能?

时间:2018-07-09 01:48:31

标签: python python-3.x tuples reduce

我试图找到一个元组中所有整数的总数

from  functools  import reduce
marks =  [("Jon" ,29 ), ("santi",35), ("anna",35)]

Total_marks = lambda x,y: x[1]

print(marks)
print (reduce(Total_marks,marks))

上面的代码可以采用整数的第一个值,但是我想找到所有整数的总和,如何在python中使用reduce来实现

4 个答案:

答案 0 :(得分:3)

更改加法函数的定义(此处无需使用lambda表示法):

def total_marks(x, y): 
    return x + y[1]

通过提供第三个可选参数,告诉reduce初始值是一个数字,而不是一个元组:

reduce(total_marks, marks, 0)
#99

与lambda相同的解决方案:

reduce(lambda x,y: x+y[1], marks, 0)

还有另一种不使用reduce的解决方案:

_, y = zip(*marks)
sum(y)
#99

答案 1 :(得分:3)

如果没有必要使用reduce,那么一个更优雅的解决方案是

marks =  [("Jon" ,29 ), ("santi",35), ("anna",35)]
total_marks = sum(score for _, score in marks)
print(total_marks)

答案 2 :(得分:2)

您将使用operator.itemgetter(1)将数字从元组中取出,并将reduceoperator.add进行求和

from  functools  import reduce
from operator import itemgetter, add
marks =  [("Jon" ,29 ), ("santi",35), ("anna",35)]

print(reduce(add, map(itemgetter(1), marks)))
# 99

没有reduce的简单解决方案是sum(mark for name, mark in marks)

答案 3 :(得分:1)

您可以检查第一个参数(x)是否为元组:

from functools import reduce
marks = [("Jon" ,29 ), ("santi",35), ("anna",35)]
new_marks = reduce(lambda x, y:(x if isinstance(x, int) else x[-1])+y[-1], marks)
assert new_marks == sum(b for _, b in marks)
print(new_marks)

输出:

99