Python列表移除非真值:for循环索引越界、while循环漏元素的原因?
移除列表非真值时的代码问题解析
1. for循环版本的索引越界问题
先看这段代码:
for n in range(len(lst)-1): #index outside the range if not bool(lst[n]): lst.pop(n) return lst
问题原因:
- 你用
range(len(lst)-1)生成的是基于原列表长度的索引序列,但循环中执行lst.pop(n)会直接缩短列表长度。比如原列表长度是9,range(len(lst)-1)会生成0到7的索引。当删掉几个元素后,列表长度可能已经小于8,此时循环到后面的索引(比如7)时,列表里根本没有这个位置的元素,直接触发索引越界错误。 - 就算改成
range(len(lst))也不行:每次pop后,后面的元素会往前挪一位,但循环还是按原索引递增,不仅会跳过元素,当列表长度持续缩短,最终还是会出现索引越界。
2. while循环版本的元素跳过问题
这段代码(注:代码里n未初始化,默认假设调用前n被设为0):
def compact(lst): while n < len(lst): if not bool(lst[n]): lst.pop(n) n+=1 print(n) return lst
问题原因:
- 当执行
lst.pop(n)移除当前元素后,列表中n位置后面的所有元素都会向前移动一位,原本在n+1位置的元素现在到了n位置。但你紧接着执行了n+=1,直接跳过了这个刚移过来的元素,没检查它是否是非真值。 - 举个例子:原列表是
[0, '', 1],n=0时pop掉0,列表变成['',1],然后n变成1,此时检查lst[1]是1(真值)不会移除,但lst[0]的空字符串(非真值)就被跳过了,没被处理。
内容的提问来源于stack exchange,提问作者iGRiK
相关产品推荐
相关产品推荐

