Python含嵌套列表的字典使用remove方法未按预期生效问题
问题根源
你写的代码出现异常的核心原因是在遍历列表的同时直接删除列表元素,会导致列表索引动态偏移,出现元素漏检的情况。
当你用for val in value遍历列表时,Python内部会维护一个遍历的索引指针,每次循环指针向后移动一位。如果此时你删除了列表中的某一个元素,这个元素之后的所有元素都会自动向前移动一位,但是指针还是会照常向后走,就会刚好跳过被删元素原本的下一个元素,没有做判断。
以你给出的example["b"]的处理过程举例:
原始example["b"]的列表顺序为:
0: ["a", "b", "c", "d"] → 含b,保留 1: ["e", "f", "b", "h"] → 含b,保留 2: ["a", "i", "j", "k"] → 不含b,被删除 3: ["o", "p", "a", "l"] → 索引2的元素被删后,这个元素自动前移到索引2的位置 4: ["a", "b", "c", "d"] → 前移到索引3 ...
删除索引2的元素后,下一次循环的指针会走到索引3的位置,刚好跳过了已经前移到索引2的["o", "p", "a", "l"],没有检查它是否包含b,所以这个不符合要求的元素被错误保留了,就出现了你看到的不符合预期的结果。
优化方案
你用的filter方案是重新生成一个新列表,不会修改原遍历的列表,所以不会出现索引偏移的问题,但是这个方案假设key在子列表的第0位,和你最初的需求「判断key是否在子列表中」不完全匹配。
更符合原始需求的写法可以用列表推导式,可读性更高:
for k, v in example.items(): example[k] = [sub_list for sub_list in v if k in sub_list]
内容的提问来源于stack exchange,提问作者pragmatic learner
相关产品推荐
相关产品推荐

