簡體   English   中英

如何逐步消除python列表中的項目?

[英]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.

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