我想將某個深層結構中的值刪除。
比如:我想要的值的列表:
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
兩張方案都可以解決這種問題~