【问题标题】:Reduce - Python减少 - Python
【发布时间】:2016-02-16 19:35:30
【问题描述】:

我正在尝试围绕以下代码进行思考。我是否可以推断出a 映射到(a+x) 并且x 是一个迭代器,它随后迭代集合中的每个元素? (例如,最初为零,然后是 1,然后是 2)?

任何指针都非常感谢!

sum = reduce(lambda a, x: a + x, [0, 1, 2, 3, 4])
print sum #10

【问题讨论】:

    标签: python lambda reduce


    【解决方案1】:

    是的,你是对的。

    只是一个小修正:a不是最初为零。它使用集合的第一个元素进行初始化。所以迭代从第二个元素开始。

    来自documentation

    将两个参数的函数从左到右累积应用于iterable的项,从而将iterable减少为单个值。例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 计算 ((((1+2)+3)+4)+5)

    所以在你的情况下reduce(lambda a, x: a + x, [0, 1, 2, 3, 4]) 计算((((0+1)+2)+3)+4),即10

    【讨论】:

      【解决方案2】:

      在 Python 中,reduce 将函数应用于列表的前 2 项,然后将相同的函数应用于列表中的第 3 项的结果,然后将函数应用于结果和列表中的第 4 项列表等等。

      在你的情况下:

       a = 0 + 1
       b = a + 2
       c = b + 3
       d = c + 4
       sum = d
      

      【讨论】:

        【解决方案3】:

        这可能有助于想象它是如何工作的:

        def my_reduce(func, iterable):
            iterator = iter(iterable)
            res = next(iterator)
            for arg in iterator:
                res = func(res, arg)
            return res
        
        >>> my_reduce(lambda a, x: a + x, [0, 1, 2, 3, 4])
        10
        

        其实这里有reducelambda两个概念。您可以定义一个“普通”函数,而不是使用lambda

        def add(a, b):
            return a + b
        

        现在,可能会更清楚一点:

        >>> reduce(add, [0, 1, 2, 3, 4])
        10 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-16
          • 2010-12-17
          • 2019-09-28
          • 2018-12-01
          • 2020-06-27
          • 2012-02-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多