将列表附加到单独的列表

时间:2016-12-28 16:25:57

标签: python multidimensional-array python-3.4

到目前为止,我的代码接收来自用户的输入,然后将所有输入附加到列表中。

list1.append(input1)

list1.append(input2)

etc

然后我将此列表附加到新列表

list2.append(list1)

所有这一切都运行正常但是当我尝试清除list1时,用户可以输入新list1的数据,列表也会从list2清除

del list1 [:]

因此,打印list2时只显示最新的list1。是否有更好的数据结构可供使用?或者如果代码的语法不同,这会有效吗?

我希望此列表具有的理想结构是:

list2 = [[x, y, z],[a,b,c],[g,h,i]] 

(我的实际代码中有更多项目)

虽然目前更像是:

list2 = [[], [], [g,h,i]]

稍后我希望能够识别并打印所有列表,如果他们的第二项是" y"。所以在上面的例子中,将返回[x,y,z]。这可以使用2D列表吗?

5 个答案:

答案 0 :(得分:2)

您有两种选择......您可以将list1副本放入list2

list2.append(list1.copy())  # `list1[:]` for older python versions

或者,您可以只创建一个新列表,而不是清除list1

list2.append(list1)
list1 = []  # Rather than `del list1[:]`

后一版本会更常见(并且性能更好),并且是我通常推荐的解决方案。

答案 1 :(得分:1)

这是因为列表通过引用传递,因此当您致电list2.append(list1)时,您实际上只是将list1的引用附加到list2

因此,如果您完全修改list1,可以在list2中看到修改:

>>> list1 = [1, 2]
>>> list2 = [list1]
>>> list1
[1, 2]
>>> list2
[[1, 2]]
>>> list1.append(3)
>>> list1
[1, 2, 3]
>>> list2
[[1, 2, 3]] # list1's changes can be seen here

要解决此问题,您可以将list1的副本附加到list2

list2.append(list1[:])

或更优选地,仅“重置”变量list1。而不是del list1[:],而是就地修改列表:

list1 = []

答案 2 :(得分:1)

您获得此行为的原因是您将引用附加到list1而不是副本。这是因为Python列表的工作方式。除非您明确告诉python 复制列表的内容,否则将附加列表的 refernece 。这意味着在说出del list1[:]时,您也会影响list1中对list2的引用

这可以通过明确告诉Python复制列表内容而不是简单地将引用复制到同一列表来解决。

list2.append(list1.copy()) # or list[:]

对于更复杂的结构,应使用copy.deepcopy()代替:

>>> import copy
...
>>> list2.append(copy.deepcopy(list1))

答案 3 :(得分:0)

list2.append(list1)

list2只是附加list1引用。您需要附加list1的副本。

import copy
list2.append(copy.copy(list1))

答案 4 :(得分:0)

而不是list2.append(list1),您应该使用:

list2.append(list1[:])  # Or list1.copy()

现在,list1的副本会附加到list2而不是list1本身。

<强>输出:

使用list2.append(list1)

>>> list2 = []
>>> 
>>> list1 = [1, 2, 3]
>>> list2.append(list1)
>>> del list1[:]
>>> 
>>> list1 = [1, 5, 5]
>>> list2.append(list1)
>>> 
>>> list2
[[], [1, 5, 5]]

使用list2.append(list1[:])

>>> list2 = []
>>>
>>> list1 = [1, 2, 3]
>>> list2.append(list1[:])
>>> del list1[:]
>>>
>>> list1 = [1, 5, 5]
>>> list2.append(list1[:])
>>>
>>> list2
[[1, 2, 3], [1, 5, 5]]