簡體   English   中英

將列表追加到單獨的列表

[英]Appending a list to a separate list

到目前為止,我的代碼接受了用戶的輸入,然后將所有輸入附加到列表中。

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列表可以嗎?

您有兩個選擇...您可以將list1副本放入list2

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

或者,除了清除list1 ,您還可以創建一個新列表:

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

后一個版本將更常見(並且性能更好),並且是我通常推薦的解決方案。

這是因為名單通過引用傳遞,所以,當你調用list2.append(list1)你真的只是一個附加參考list1list2

因此,如果您完全修改了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 = []

出現此行為的原因是因為您將引用附加到list1而不是副本。 這是因為Python列表的工作方式。 除非您明確告訴python 復制列表的內容, 否則將附加對列表的引用 這意味着在說del list1[:]時也會影響對list2 list1的引用

這可以通過明確地告訴Python復制列表內容來解決,而不是簡單地將引用復制到同一列表中。

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

對於更復雜的結構,應copy.deepcopy()

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

list2只是追加list1參考。 您需要追加list1的副本。

import copy
list2.append(copy.copy(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]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM