我想将某个深层结构中的值删除。
比如:我想要的值的列表:
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
两张方案都可以解决这种问题~