如何在python中的2d列表中存储新列表集?

时间:2018-04-08 15:17:28

标签: python list

我有一个列表path。最初,它看起来像这样:

path = [2, 1, 3, 0]

我必须在我的流程的不同步骤中对path运行许多操作。但是我必须在每一步之后存储path的内容。我的意思是,

path = [2, 1, 3, 0]

path.pop() # need to store

path.pop() # same

path.append(9) # same

path.append(5) # same

因此,在每个步骤之后,路径将如下所示:

path = [2, 1, 3, 0]

path = [2, 1, 3]

path = [2, 1]

path = [2, 1, 9]

path = [2, 1, 9, 5]

因为我需要其中的每一个所以我想将它们存储在2D列表中。因此,最后,2D列表将如下所示:

但问题是,最初我不知道custom_list有多大?它只在运行时决定。所以我认为在每个步骤之后我会将path附加到我的custom_list,以便当流程完成时custom_list将存储上述所有path's内容。像这样:

custom_list = [[2, 1, 3, 0], [2, 1, 3], [2, 1], [2, 1, 9], [2, 1, 9, 5]]

但是对于这个.append不起作用。如何解决这个问题呢?

使用list实现此功能也是有效的,还是应该选择其他任何方式,即numpy array或其他任何方式?如果是,那么请提及并解释

修改 代码:

list = [2,1,3,0]
my_list = [[]]
my_list.append(list)
list.pop()
list.pop()
list.append(9)
my_list.append(list)
list.append(5)
my_list.append(list)
my_list
>>>[[], [2, 1, 9, 5], [2, 1, 9, 5], [2, 1, 9, 5]]

3 个答案:

答案 0 :(得分:2)

最好使用不可变集合(为要跟踪的每个州创建tuple):

list = [2,1,3,0]
my_list = [()]
my_list.append(tuple(list))
list.pop()
list.pop()
list.append(9)
my_list.append(tuple(list))
list.append(5)
my_list.append(tuple(list))
my_list
# produces [(), (2, 1, 3, 0), (2, 1, 9), (2, 1, 9, 5)]

您的问题是list正在被修改,然后my_list只包含对同一列表的多个引用。无法对tuple进行修改。每次添加都是一个全新的实例。

如果出于某种原因需要坚持使用列表,可以使用list[:]创建副本:

my_list.append(list[:])

答案 1 :(得分:1)

使用copy.deepcopy
每当你执行追加并弹出列表上的所有操作时,所以在上次操作之后无论列表有值,它都打印相同的

In [10]: path=[1,2,3,4]

In [11]: path2=path

In [12]: path.pop()
Out[12]: 4

In [13]: path2
Out[13]: [1, 2, 3]

In [14]: #using deepcopy

In [15]: import copy

In [16]: path=[1,2,3,4]

In [17]: path2=copy.deepcopy(path)

In [18]: path.pop()
Out[18]: 4

In [19]: path2
Out[19]: [1, 2, 3, 4]

修改了你的代码:

  import copy
    list = [2,1,3,0]
    my_list = [] #take the inly list
    my_list.append(copy.deepcopy(list))
    list.pop()
    list.pop()
    list.append(9)
    my_list.append(copy.deepcopy(list))
    list.append(5)
    my_list.append(copy.deepcopy(list))
    print(my_list)

结果:

[[2, 1, 3, 0], [2, 1, 9], [2, 1, 9, 5]]

答案 2 :(得分:1)

使用path[:]path.copy()制作副本

cusls = []
path = [2, 1, 3, 0]
cusls.append(path[:])
path.pop() # need to store
cusls.append(path[:])
path.pop() # same
cusls.append(path[:])
path.append(9) # same
cusls.append(path[:])
path.append(5) # same
cusls.append(path[:])

cusls
Out[25]: [[2, 1, 3, 0], [2, 1, 3], [2, 1], [2, 1, 9], [2, 1, 9, 5]]