之前遇到过一次,删除列表中符合条件的元素,for循环挨个判断是否符合条件,符合就删除,删完结果发现有一个符合条件的没有删掉。app
那么若是想删除某些列表中的元素,好比有一个a列表,a=[11,22,33,44,55,66,77]spa
删除a中的22和33,应该如何作呢?内存
若是你这样写:ci
for i in a:rem
if i == 22 or i==33:for循环
a.remove(i)table
若是按照这样写,22被如期删掉了,但33却没有,删完的结果是:[11,33,44,55,66,77]不信你试试循环
为何呢~~?请看如下分解图,第一次循环,i指向11,不删除:top
11tab |
22 |
33 |
44 |
55 |
66 |
77 |
↑
第二次循环,i指向22,符合删除条件了,遂删除,
11 |
22 |
33 |
44 |
55 |
66 |
77 |
↑
删除后,内存会变为:
11 |
33 |
44 |
55 |
66 |
77 |
↑
注意喽,看到了嘛?如今33跑到本来22的位置上了,i仍旧指向的是第二个位置,那么第三次循环,i就会继续向下指向44了,就把33跳过去了,依次类推直到完成循环。
因此知道为何上面那段代码会有问题了吧。那么怎么解决呢?只须要找一个临时列表b将要删除的东西存起来,而后再去原列表依次删
代码改为:
b=[]
for i in a:
if i == 33 or i==44:
b.append(i)
for i in b:
if i in a:
a.remove(i)