我正在使用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]
]
非常感谢您的帮助!
答案 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[:])
答案 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))