在循环体中对列表元素进行判断,把符合或者不符合某个条件的元素删掉,这时会存在漏删的可能。举例如下:
把列表中含有“an” 的元素删除
list = ['Wang','Zhang','Li','ling','Du','Jane','Fan','Jack']
for each in list:
if "an" in each:
list.remove(each)
print(list)
运行的结果是:
['Zhang', 'Li', 'ling', 'Du', 'Fan', 'Jack']
可以看到“Zhang” 和 “Fan” 都符合条件,但是都没有被删掉,说明被漏删了。原因在于第一个元素“Wang” 符合条件,被删掉了以后,列表动态变化,“Zhang”变成了现在第一个元素,"Li"是变成了现在第二个元素,但是现在的for 循环的index变成了索引第二个,开始处理“Li”,就这样把“Zhang”漏掉了。
为了避免这个问题,解决方案有两种。
第一种:
用变量 i 索引,但是要注意从后往前,从前往后的话还是会有上面的问题。
list = ['Wang','Zhang','Li','ling','Du','Jane','Fan','Jack']
for i in range(len(list)-1, -1, -1): # 这里注意从后往前遍历
if "an" in list[i]:
list.remove(list[i])
print(list)
第二种:
重新开一个列表,保存需要删掉的元素,然后在原始列表中依次找到删除
list = ['Wang','Zhang','Li','ling','Du','Jane','Fan','Jack']
list_tmp = []
for each in list:
if 'an' in each:
list_tmp.append(each)
for each in list_tmp:
list.remove(each)
print(list)
上面两种的运行结果都是:
['Li', 'ling', 'Du', 'Jack']