【问题标题】:Creating new cumulative list of lists from existing list从现有列表创建新的累积列表列表
【发布时间】:2020-03-08 06:50:48
【问题描述】:

使用 Python,我正在尝试构建列表的累积列表,其中列表中的每个元素都按列表中前一个元素的值的数量增长。下面的代码示例应该会更清楚。

my_list = [[1,2,3],[4,5,6],[7,8,9]]
list_new = []
final_list = []

for i in my_list:
    list_new += i
    final_list.append(list_new)

我正在尝试得到结果

[
  [1,2,3]
, [1,2,3,4,5,6]
, [1,2,3,4,5,6,7,8,9]
]

但我得到了

[
  [1,2,3,4,5,6,7,8,9]
, [1,2,3,4,5,6,7,8,9]
, [1,2,3,4,5,6,7,8,9]
]

非常感谢您的帮助!

【问题讨论】:

    标签: python list loops


    【解决方案1】:

    您只需复制一份新列表并添加最终列表,而不是添加list_new 本身。

    这样做的原因是,列表是一种引用类型,因此附加到它会修改引用此列表的任何其他位置,因此,您正在创建一个新列表。

    final_list.append(list_new[:])
    

    Example

    【讨论】:

      【解决方案2】:

      或者,使用itertools.accumulate:

      >>> my_list = [[1,2,3],[4,5,6],[7,8,9]]
      >>> list(itertools.accumulate(my_list))
      [[1, 2, 3], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6, 7, 8, 9]]
      

      【讨论】:

        【解决方案3】:

        在一行中它看起来像这样:

        result = [[element for sub in my_list[:i] for element in sub] for i, _ in enumerate(my_list, 1)]
        result
        #[[1, 2, 3]
        # [1, 2, 3, 4, 5, 6]
        # [1, 2, 3, 4, 5, 6, 7, 8, 9]]
        

        【讨论】:

          【解决方案4】:

          问题是 final_list 包含对同一个 list_new 的三个引用。 相反,您希望每次将列表推送到 final_list 时都对其进行克隆。 你可以这样做

          final_list.append(list(list_new))
          

          总共:

          my_list = [[1,2,3],[4,5,6],[7,8,9]]
          list_new = []
          final_list = []
          for i in my_list:
            list_new += i
            final_list.append(list(list_new))
          

          【讨论】:

            【解决方案5】:

            += 改变了单个列表 list_new,并且您重复地将对同一列表的引用添加到 final_list。您需要向final_list 添加一个 列表。

            my_list = [[1,2,3],[4,5,6],[7,8,9]]
            list_new = []
            final_list = []
            
            for i in my_list:
                tmp = list_new + i
                final_list.append(tmp)
                list_new = tmp
            

            或者,与其创建一个新列表然后将名称 list_new 重新绑定到它,而是继续就地更新 list_new,但添加一个 副本final_list

            my_list = [[1,2,3],[4,5,6],[7,8,9]]
            list_new = []
            final_list = []
            
            for i in my_list:
                list_new += i
                final_list.append(list_new[:])
            

            或者,使用itertools.accumulate 并不要自己担心累加器。

            from operator import add
            from itertools import accumulate
            
            my_list = [[1,2,3],[4,5,6],[7,8,9]]
            final_list = list(accumulate(my_list, add))
            

            您可以省略显式的add 参数,因为accumulate 将默认使用该参数。

            final_list = list(accumulate(my_list))
            

            【讨论】:

            • add 运算符不需要(这是默认值)。
            • 啊,对。我对sum 感到困惑,sum(my_list) 会失败,但sum(my_list, []) 会起作用(因为sum 需要一些帮助才能知道使用哪个+)。
            猜你喜欢
            • 2018-09-24
            • 1970-01-01
            • 2019-04-29
            • 2017-02-25
            • 2018-04-11
            • 1970-01-01
            • 1970-01-01
            • 2017-11-14
            • 2019-12-27
            相关资源
            最近更新 更多