将一个列表添加到一个单独的列表中
到目前为止,我的代码接受来自用户的输入,然后将所有这些输入附加到列表中。将一个列表添加到一个单独的列表中
list1.append(input1)
list1.append(input2)
etc
然后我追加此列表成为一个新列表
list2.append(list1)
所有这一切工作正常,但当我尝试清除列表1,因此用户可以为新的列表1的输入数据,列表也是从列表2
del list1 [:]
打印列表2时,那么只显示最新列表1清除。有更好的数据结构可供使用吗?或者,如果代码的语法不同,这个工作是否会起作用?
理想的结构,我想这个名单已经是:
list2 = [[x, y, z],[a,b,c],[g,h,i]]
(有我的实际代码更为项)
虽然目前它更像是:
list2 = [[], [], [g,h,i]]
后来我希望能够识别和打印所有列表,如果他们的第二个项目是“Y”。所以在上面的例子中,将会返回[x,y,z]。这可能使用2D列表吗?
这是因为名单通过引用传递,所以,当你调用list2.append(list1)
,你真的只是追加到list2
到list1
参考。
所以,如果你修改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 = []
。
list2.append(list1)
list2只是追加list1引用。你需要追加list1的副本。
import copy
list2.append(copy.copy(list1))
你有两个选择......你可以把任何的list1
一个副本为list2
:
list2.append(list1.copy()) # `list1[:]` for older python versions
或者,而不是清除list1
,你可以做一个新的列表:
list2.append(list1)
list1 = [] # Rather than `del list1[:]`
这后一个版本将会更常见(和更好的表现),是我想要的解决方案推荐。
相反的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]]
原因你获得这种行为是因为你的追加参考到list1
而不是副本。这是因为Python列表的工作方式。除非你明确地告诉python到拷贝列表的内容,否则将附加一个列表参考列表。这意味着,说del list1[:]
当你还影响list2
这可以通过明确地告诉Python来复制你的列表中的内容要解决的参考list1
,而不是简单地复制到同一列表的引用。
list2.append(list1.copy()) # or list[:]
对于更复杂的结构,copy.deepcopy()
应该使用:
>>> import copy
...
>>> list2.append(copy.deepcopy(list1))
“两个选项”部分是正确答案的唯一途径。 –