【问题标题】:Python Running Sum in List [duplicate]Python在列表中运行总和[重复]
【发布时间】:2017-05-14 10:58:58
【问题描述】:

给定以下列表:

a=[1,2,3]

我想生成一个新列表,其中每个数字都是它和它之前的值的总和,如下所示:

result = [1,3,6]

逻辑:

1 没有前面的值,所以它保持不变。

3 是从第一个值 (1) 添加到列表中第二个数字的值 (2)

6 是前两个元素的 1 和 2 之和,加上第三个值 3。

提前致谢!

【问题讨论】:

    标签: python numpy sum cumulative-sum


    【解决方案1】:

    Python 3 有 itertools.accumulate 正是为了这个目的:

    >>> from itertools import accumulate
    >>> a=[1,2,3]
    >>> list(accumulate(a))
    [1, 3, 6]
    

    【讨论】:

      【解决方案2】:

      Python 对此有一个函数。

      import itertools
      
      result = list(itertools.accumlate([1, 2, 3]))
      

      Python itertools 可以很好地解决一些问题,您应该花点时间仔细阅读它们。

      https://docs.python.org/3/library/itertools.html

      【讨论】:

        【解决方案3】:

        Avinash Raj 的代码无法正常工作。

        a = [1,2,3]
        b = [sum(a[:(i+1)]) for i, j in enumerate(a)]
        print(b)
        

        根据@Avinash Raj 编辑

        【讨论】:

        • 是的,一个更简单的[sum(a[:i+1]) for i,j in enumerate(a)]
        • 虽然这具有声明性的优点,因此可读性很好,但与具有可变累积变量的简单迭代解决方案(具有O(n))。
        【解决方案4】:

        普通的循环怎么样?

        a = [1,2,3]
        result = []
        s = 0
        for item in a:
            s += item
            result.append(s)
        
        print(result)
        

        【讨论】:

          【解决方案5】:

          大约有一百种不同的方法来计算这种累积和。根据您实际想要使用结果的目的,不太明显或不太通用的解决方案可能更节省时间或内存 - 尽管下面的简单解决方案是 O(1)内存和 O(N) 时间。

          几乎所有命令式编程语言中最直接的过程方法都是这样的:

          csum=0
          result=[]
          for val in a:
              csum += val
              result.append(csum)
          

          Python 标准库还包括一个执行此操作的函数:itertools.accumulate

          import itertools
          result = list(itertools.accumulate(a))
          

          【讨论】:

            【解决方案6】:

            如果你想要一个 numpy 解决方案

            from numpy import cumsum
            result = list(cumsum(a))
            

            【讨论】:

            • 如果它比内置的 Python 版本快得多。
            【解决方案7】:

            试试这个..

            def running_sum(a):
              tot = 0
              for item in a:
                tot += item
                yield tot
            
            a = [1,2,3,4]
            print list(running_sum(a))
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-01-24
              • 1970-01-01
              • 1970-01-01
              • 2014-03-03
              • 1970-01-01
              • 1970-01-01
              • 2018-06-09
              • 2015-04-22
              相关资源
              最近更新 更多