【问题标题】:Sum all list-elements to new list [duplicate]将所有列表元素求和到新列表[重复]
【发布时间】:2016-09-16 13:52:31
【问题描述】:

我有一个旧列表,我想将每个元素汇总到一个新列表中:

    lst_old = [1, 2, 3, 4, 5]
    lst_new = [1, 3, 6, 10, 15]

有没有一种优雅的方法可以在 Python 3 中使用简短而快速的代码来实现它?除了 sum() 仅打印最后一个元素之外,我找不到适合我的问题的解决方案。

【问题讨论】:

    标签: python list python-3.x


    【解决方案1】:

    您可以使用itertools.accumulate,例如:

    from itertools import accumulate
    
    lst_old = [1, 2, 3, 4, 5]
    lst_new = list(accumulate(lst_old))
    # [1, 3, 6, 10, 15]
    

    【讨论】:

    【解决方案2】:

    乔恩克莱门茨提到的itertools.accumulate 是最好的方法。但是,如果您想要一种明确的方式来做到这一点,这里是:

    lst_old = [1, 2, 3, 4, 5]
    sum = 0
    lst_new = []
    for item in lst_old:
        sum += item
        lst_new.append(sum)
    

    这样做的主要优点是,您可以将其包装在一个函数中,如果需要执行任何转换或验证,可以添加。

    例如,假设您想停止函数在限制后继续运行,以下将有所帮助:

    def accumulate_items(lst_old, limit=0):
        sum = 0
        output_list = []
        for item in lst_old:
            sum += item
            output_list.append(sum)
            if limit and sum > limit:
                break
        return output_list
    

    如果需要在这里进行任何转换或操作,灵活性将是无限的。有需要设置的前提条件吗?前进。有需要测试的后置条件吗?前进。非常庞大的列表,想要一个基于生成器的解决方案,就像 itertools.accumulate 一样?前进。需要添加验证或异常处理?来吧。

    但是,没有转化而只是积累?上一个答案是最好的。将 sum 与列表索引一起使用会非常慢,因为复杂度的顺序会飞速增长。

    【讨论】:

      【解决方案3】:

      您可以使用 listname[start:end] 获取列表切片的总和,其中 start 和 end 作为可选参数(默认为列表的开头和结尾):

      lst_old = [1, 2, 3, 4, 5]
      lst_new = []
      
      for i, num in enumerate(lst_old):
          index = i+1
          var = sum(lst_old[:index])
          print(var)
          lst_new.append(var)
      

      【讨论】:

      • 乔恩的回答也是如此。您也可以将起始值传递给枚举,而不是手动递增。但是,我没有投反对票:)
      猜你喜欢
      • 2013-06-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多