【问题标题】:How to use reduce function here? [duplicate]如何在这里使用reduce函数? [复制]
【发布时间】:2018-12-16 15:42:39
【问题描述】:

我正在尝试查找元组中所有整数的总和

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来做到这一点

【问题讨论】:

  • 使用reduce吗? sum(score for name, score in marks) 在我看来更具可读性。
  • @LakshayGarg ,当然,请发布
  • 按照其他帖子的建议,你可以试试print(reduce(lambda x,y:x+y[1], marks,0))stackoverflow.com/a/12218359/5916727

标签: python python-3.x tuples reduce


【解决方案1】:

改变加法函数的定义(这里不需要使用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

【讨论】:

  • 太棒了... ...
【解决方案2】:

如果不需要使用reduce,一个更优雅的解决方案是

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

【讨论】:

  • 这很简单,你可以发布完整的代码
  • @Karamzov 我已经更新了代码
  • sum 和 for 在这里如何工作,他们如何知道读取值?
  • sum 是 python 的内置函数,可用于对可迭代对象(列表、元组、生成器等)求和。这里有趣的部分是score for _, score in marks。这就是所谓的列表推导。评论太短而无法解释它的作用,请参阅blog。谷歌搜索“python 中的列表推导”也会有所帮助。
  • 好的...有帮助....
【解决方案3】:

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

【讨论】:

  • 甚至sum(map(itemgetter(1), marks)) 以获得更简单的解决方案。
  • 谢谢帕特里克....
【解决方案4】:

您可以检查第一个参数(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

【讨论】:

  • 为什么投反对票?
  • 我觉得这是对reduce 的过于复杂的使用,因为您可以提供初始值:reduce(lambda x, y: x + y[1], marks, 0)。否则会发生reduce 将第一个值作为累加器,这增加了不必要的复杂性。
  • 好一个..谢谢
  • @Karamzov 很高兴为您提供帮助!
猜你喜欢
  • 2019-08-10
  • 1970-01-01
  • 2014-10-25
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 2017-10-14
  • 2021-09-08
相关资源
最近更新 更多