【问题标题】:Why is reduce returning a list instead of a single value?为什么 reduce 返回一个列表而不是单个值?
【发布时间】:2020-10-13 07:17:47
【问题描述】:

我只是在探索 reduce,但我并不了解它背后的整个系统。我确实知道 reduce 很可能会返回一个值,但是在这种情况下它是如何工作的呢?

    answer = reduce(lambda x, y: x[0]*x[1] * ([y[0] + y[1]]), [(2,6), (1, 2), (5, 6)])

【问题讨论】:

  • 返回单个值;该值是一个列表。
  • 因为您的lambda 正在返回一个列表,而reduce 的结果将是您的lambda 的最后一个返回值。 (2 * 6 * ([1 + 2]) 导致[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
  • 您的 lambda 表达式从右侧的外括号创建一个列表。

标签: python reduce functools


【解决方案1】:

[y[0] + y[1]] 是一个列表,因此您的 lambda 将整数 x[0]*x[1] 乘以列表 ([y[0] + y[1]]),因此您会得到另一个列表,因为:

>>> 5 * [6]
[6, 6, 6, 6, 6]
>>> 8 * [4,6]
[4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6]

至于为什么结果是9 * [11]

>>> def thing(x, y):
...  print(x, y)
...  return x[0]*x[1] * ([y[0] + y[1]])
... 
>>> reduce(thing, [(2,6), (1, 2), (5, 6)])
1. (2, 6) (1, 2)
2. [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] (5, 6)
[11, 11, 11, 11, 11, 11, 11, 11, 11]
  1. x == (2, 6), y == (1, 2) => tmp1 == (2 * 6) * [1 + 2] == 12 * [3]
  2. 第一个参数是累加器,所以x 现在是上一次迭代中的 3 列表。根据您的公式,result == (3 * 3) * [5 + 6] == 9 * [11]

【讨论】:

  • 好的,谢谢您的建议。在我的示例中,返回值为 [11, 11, 11, 11, 11, 11, 11, 11, 11]。为什么?我不明白,为什么第三个值(5,6)乘以九...
  • @Guckinho 首先将使用x = (2, 6)y = (1, 2) 调用您的lambda。接下来,您的 lambda 将被调用,x 是先前调用返回的任何内容,y = (5, 6)。写在纸上。
  • 谢谢大家,我现在明白了!
  • @Guckinho,也请查看我的编辑以获得进一步的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 2012-12-02
  • 1970-01-01
  • 2016-01-15
  • 2019-12-20
  • 2019-11-23
  • 1970-01-01
相关资源
最近更新 更多