【问题标题】:python reduce method works with length of 2 list but not with length with 3 or morepython reduce 方法适用于长度为 2 的列表,但不适用于长度为 3 或更多的列表
【发布时间】:2021-09-26 15:00:54
【问题描述】:

我有一组这样的点:

points = [[1, 1], [2, 3]]

我想分别将 x 分量和 y 分量相加,所以我写了这段代码

sum_x = reduce(lambda a, b: a[0] + b[0] ,points)
sum_y = reduce(lambda a, b: a[1] + b[1], points)

如果我只有 2 分,它可以工作,但如果我添加更多分,那么我会收到此错误:

Traceback (most recent call last):
  File "linear-regression.py", line 29, in <module>
    sum_x = reduce(lambda a, b: a[0] + b[0], points)
  File "linear-regression.py", line 29, in <lambda>
    sum_x = reduce(lambda a, b: a[0] + b[0], points)
TypeError: 'int' object is not subscriptable

【问题讨论】:

    标签: python functional-programming


    【解决方案1】:

    你的累加器应该是一个整数,而不是一个列表。您可以将其初始化为零以启动它。如果你不初始化它,初始值将是第一个值([1, 1]),这不是你想要的。

    from functools import reduce
    
    points = [[1, 1], [2, 3], [2, 3]]
    
    
    sum_x = reduce(lambda a, b: a + b[0], points, 0)
    # 5
    sum_y = reduce(lambda a, b: a + b[1], points, 0)
    # 7
    

    或者,您可以在一个步骤中执行此操作并返回总和列表:

    sum_x, sum_y = reduce(lambda a, b: [a[0] + b[0], a[1] + b[1]], points)
    

    现在将初始值作为累加器传入是有意义的,因为最终值是一个列表。

    【讨论】:

    • 我好像没看懂这个概念,我应该直接阅读文档所以我要删除帖子
    • 祝你好运。每个人都需要一段时间才能理解 reduce。
    【解决方案2】:

    Mark 的回答解决了您当前的问题,但我想指出一些更普遍的问题,特别是因为您标记了 (其核心是将功能分解为不可约的部分)。您正在执行您尝试将其视为一项的两项操作。你的计算可以概括为

    1. 获取每个向量的第一个元素
    2. 求和

    我们可以把这两个步骤分开。

    sum_x = reduce(lambda a, b: a + b, map(lambda x: x[0], points))
    

    而reduce 加上作为操作在Python 中有一个名称:sum

    sum_x = sum(map(lambda x: x[0], points))
    

    现在我们的代码读作“获取第一个元素并将它们求和”。

    【讨论】:

      【解决方案3】:

      为什么不直接

      points = [[1, 1], [2, 3]]
      sum_x, sum_y = map(sum, zip(*points))
      

      这适用于任意长度的列表points。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-13
        • 2017-05-31
        • 2012-01-01
        • 1970-01-01
        • 2021-02-25
        • 2019-04-13
        • 1970-01-01
        相关资源
        最近更新 更多