【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

两张方案都可以解决这种问题~

发布了1164 篇原创文章 · 获赞 1245 · 访问量 970万+

猜你喜欢

转载自blog.csdn.net/weixin_40400177/article/details/103879893