【Python3】 深層結構中的值刪除問題/ python列表刪除值出錯

我想將某個深層結構中的值刪除。

比如:我想要的值的列表:

wanted_value_list= ['want1', 'want2', 'want3']
exist_list = [[['want1', 'want2'], ['others', 'want1'], ['others', 'others']]

# exist是一個list中的list中的list的str。
# 此處的測試樣例中存在着:
# 全部值均爲我想要的['want1', 'want2']
# 部分值爲我想要的['ohters', 'want2']
# 我都不想要的 ['ohters', 'want2']
# 如果想要遍歷這一值
則代碼爲:
for one_layer_list_index, one_layer_list in enumerate(exist_list):
    for two_layer_list_index, two_layer_list in enumerate(one_layer_list):
        for value in two_layer_list:
            if value not in exist_list:
                # 這時候我們需要丟棄掉這一個值,對嗎? 但是如果直接使用刪除,則無法影響最外層的整體的值,
                #因爲遍歷的時候其實是重新賦值。所以我們需要從最外層的index來影響整體的list值存儲,
                #也就是exist_list
                #因此,我們代碼這樣寫:
                exist_list[one_layer_list_index][two_layer_list_index].remove(value) 
                # 這個value我們不想要的。

這樣的處理方式,對於第一、二個測試樣例都不會有問題,但是在第三個時會出現問題。因爲在remove第一個’others’值的時候,會改變正在遍歷的two_layer_list,但是第三層遍歷的index並沒有改變
也就是說

例如隱藏的index = 0時,這時候
two_layer_list = ['others','others']
但當執行remove了之後,遍歷結束了,這時index = 1(我們是看不見的
這時候要注意! two_layer_list = ['others']值被及聯修改了。

那麼index = 1的索引與長度相等,就會跳過對比第二個值。
也就是說,最後的結果是這樣的:

wanted_value_list= ['want1', 'want2', 'want3']
exist_list = [[['want1', 'want2'], ['want1'], ['others']]

這樣就與我們期待的效果有點出入了。
那麼如何改變這樣的情況呢?
其實解決的辦法有很多。

  • 第一種: 維持遍歷的two_layer_list的值不變即可。
  • 第二種:增加enumerate,使得刪除後index - 1。
    我這邊選擇了第一種情況。
    加了一個deepcopy就可以了

解決方案一:就是維持遍歷的two_layer_list的值不變

from copy import copy
wanted_value_list= ['want1', 'want2', 'want3']
exist_list = [[['want1', 'want2'], ['others', 'want1'], ['others', 'others']]

則代碼爲:
for one_layer_list_index, one_layer_list in enumerate(exist_list):
    for two_layer_list_index, two_layer_list in enumerate(one_layer_list):
        for value in deepcopy(two_layer_list):
            if value not in exist_list:
                exist_list[one_layer_list_index][two_layer_list_index].remove(value)

解決方案二:增加enumerate,使得刪除後index - 1

wanted_value_list= ['want1', 'want2', 'want3']
exist_list = [[['want1', 'want2'], ['others', 'want1'], ['others', 'others']]

則代碼爲:
for one_layer_list_index, one_layer_list in enumerate(exist_list):
    for two_layer_list_index, two_layer_list in enumerate(one_layer_list):
        for value_index, value in enumerate(two_layer_list):
            if value not in exist_list:
                exist_list[one_layer_list_index][two_layer_list_index].remove(value)
                value_index -= 1

兩張方案都可以解決這種問題~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章