根据现有列表创建新的列表累积列表

时间:2019-11-12 14:32:17

标签: python list loops

我正在使用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]
]

非常感谢您的帮助!

5 个答案:

答案 0 :(得分:4)

或者,使用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]]

答案 1 :(得分:3)

您只需要新建一个列表副本并添加最终列表,而不是添加list_new本身。

之所以这样,是因为列表是引用类型,因此添加到列表将修改该列表所引用的任何其他位置,因此,您将创建一个新列表。

final_list.append(list_new[:])

Example

答案 2 :(得分:0)

一行显示如下:

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]]

答案 3 :(得分:0)

问题在于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))

答案 4 :(得分:0)

+=改变单个列表list_new的位置,然后您将对同一列表的引用重复添加到final_list中。您需要将一个 new 列表添加到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添加 copy

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))