[英]How to eliminate the items in the python list step by step?
我正在使用“for循環”逐步消除該項目並生成一個包含不同組合的新列表(feature_combination)。
feature_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
feature_combination = []
for i in range(7):
feature_list.pop()
feature_combination.append(feature_list)
feature_combination
理想的 output 應該是:
[['A', 'B', 'C', 'D', 'E', 'F'],['A', 'B', 'C', 'D', 'E'],['A', 'B', 'C', 'D'],['A', 'B', 'C'],['A', 'B'],['A'], []]
但是現在的output是: [[], [], [], [], [], [], []]
當我逐步打印進度時:
feature_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
feature_combination = []
for i in range(7):
feature_list.pop()
print(feature_list)
我可以得到以下結果:
['A', 'B', 'C', 'D', 'E', 'F']
['A', 'B', 'C', 'D', 'E']
['A', 'B', 'C', 'D']
['A', 'B', 'C']
['A', 'B']
['A']
[]
那么,為什么我不能將這些結果 append 放到一個空列表中呢? 問題是什么?
這是因為當您調用feature_combination.append(feature_list)
時,您附加的是對feature_list
的引用,而不是feature_list
的實際值。 因為在 for 循環結束時feature_list
是空的,所以對它的所有引用也是空的。
您可以通過將feature_combination.append(feature_list)
更改為feature_combination.append(feature_list.copy())
來修復它,這會復制要存儲的列表。
Python 變量是一個符號名稱,它是指向 object 的引用或指針。 將 object 分配給變量后,您可以按該名稱引用 object。 但數據本身仍包含在 object 中。 參考這個。
這是因為feature_list
指向一個特定的 object,它會在您隨后彈出時不斷更新。 您基本上是在創建一個包含 [object, object, object...] 的列表,所有這些都指向相同的feature_list
object。 隨着您不斷彈出和更新 object,收集同一 object 的多個實例的列表也將使用此 object 進行更新。
這是您如何測試這種情況的方法 -
feature_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
feature_combination = []
for i in range(7):
feature_list.pop()
feature_combination.append(feature_list)
print('iteration', i)
print(feature_combination) #Print the primary list after each iteration
iteration 0
[['A', 'B', 'C', 'D', 'E', 'F']]
iteration 1
[['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E']]
iteration 2
[['A', 'B', 'C', 'D'], ['A', 'B', 'C', 'D'], ['A', 'B', 'C', 'D']]
iteration 3
[['A', 'B', 'C'], ['A', 'B', 'C'], ['A', 'B', 'C'], ['A', 'B', 'C']]
iteration 4
[['A', 'B'], ['A', 'B'], ['A', 'B'], ['A', 'B'], ['A', 'B']]
iteration 5
[['A'], ['A'], ['A'], ['A'], ['A'], ['A']]
iteration 6
[[], [], [], [], [], [], []]`
請注意,在每次迭代之后,子列表的每個實例都會在彈出后更新並反映在主列表中。
解決方法是使用切片來獲取和存儲副本。
feature_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
feature_combination = []
for i in range(7):
feature_list.pop()
print(feature_list)
feature_combination.append(feature_list[:]) #<----
feature_combination
[['A', 'B', 'C', 'D', 'E', 'F'],
['A', 'B', 'C', 'D', 'E'],
['A', 'B', 'C', 'D'],
['A', 'B', 'C'],
['A', 'B'],
['A'],
[]]
首先,您需要將索引傳遞給 pop 以指定要刪除的元素。 雖然我覺得這不合適,但你可以使用切片。 以下是您如何實現目標的示例。 此代碼調整為您想要的 output。
feature_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
feature_combination = []
for i in range(7):
feature_list = feature_list[:-1]
feature_combination.append(feature_list)
print(feature_combination)
output
[['A', 'B', 'C', 'D', 'E', 'F'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D'], ['A', 'B', 'C'], ['A', 'B'], ['A'], []]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.