【问题标题】:How to calculate sum using list comprehension如何使用列表理解计算总和
【发布时间】:2017-12-02 11:15:57
【问题描述】:

如何使用列表理解获得此列表的累积总和:

list_comp=[1,4,9,16] 

这是我尝试过的,但它会打印列表中每个项目的两倍

print([x+x for x in list_comp])

我希望结果是: list_comp=[1,5,14,30] 但我得到了这个:

>> [2, 8, 18, 32]

【问题讨论】:

标签: python python-3.x list list-comprehension


【解决方案1】:

列表推导用于映射或过滤列表。它们不能有内部状态,这是您有效执行此操作所需要的。

但是在 Python 3 中有 itertools.accumulate

import itertools

print(list(itertools.accumulate([1, 4, 9, 16])))  # [1,5,14,30]

【讨论】:

  • 我认为accumulate是在Python 3中引入的?
  • 是的,我会补充的。但无论如何,这个问题都是针对 Python 3 的。
【解决方案2】:

你可以这样做,通过结合切片和列表推导,但有效地进行累积和是笨拙的。

comp=[1,4,9,16] 
[sum(comp[:idx+1]) for idx in range(len(comp))]

我不建议使用它,它会重新计算总和 n 次


正确的 cumsum 方法可以这样完成:

def cumsum(seq):
    cumulative = [seq[0]]
    for elt in seq[1:]:
        cumulative.append(cumulative[-1] + elt)
    return cumulative

itertools.accumulate 是@NielsWerner 演示的另一种方式。


使用numpy 库和该库的cumsum 函数可以提高效率。

【讨论】:

    【解决方案3】:

    海象操作员可以帮助解决这个任务:

    lst = [1,4,9,16] # expected result: [1,5,14,30] 
    buf = 0
    res = [buf := buf + num for num in lst]
    print(res)
    

    [注:海象运算符是在python 3.8中引入的]

    【讨论】:

    • python 3.8引入海象算子
    【解决方案4】:
    import numpy as np
    a = [1,4,9,16] 
    
    b = np.cumsum(a)
    print(list(b))
    

    【讨论】:

      【解决方案5】:

      如果您使用的是 Python 2,我想再添加一种方法来实现这一点:

      def cumulative_sum(seq):
          prev = 0
          result = []
          for item in seq:
              result.append(prev+item)
              prev += item
          return result
      

      对于 Python 3,我建议使用内置方法 itertools.accumulate

      【讨论】:

        【解决方案6】:

        你可以试试这个……

        list_comp=[1,4,9,16]
        b=[sum(list_comp[0:x+1]) for x in range(0,len(list_comp))]
        print(b)
        

        【讨论】:

          猜你喜欢
          • 2021-02-26
          • 1970-01-01
          • 1970-01-01
          • 2020-09-26
          • 2020-01-02
          • 2016-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多