for循环,并不是所有符合条件的项目都被删除

时间:2017-07-21 14:53:57

标签: python string list for-loop

我有一个for循环,它应该从包含' 0'的列表中删除所有字符串项。但是,它只删除了其中一些。

for e in l:
    if '0' in e:
        l.remove(e)

在我的情况下l是一个转换成字符串的整数列表,在我的测试运行中,这个列表在执行for循环之前看起来像这样:

['12345', '23456', '34567', '45678', '56789', '67891', '78910', '89101', '91011', '10111', '01112', '11121', '11214', '12141', '21414', '14145', '41455', '14555', '45550', '55500', '55008', '50088', '00887']

之后就这样:

['12345', '23456', '34567', '45678', '56789', '67891', '89101', '10111', '11121', '11214', '12141', '21414', '14145', '41455', '14555', '55500', '50088']

只删除了六个元素,一些元素仍然包含' 0'然而,仍然离开了。

3 个答案:

答案 0 :(得分:3)

在迭代期间不要删除元素

l =  ['12345', '23456', '34567', '45678', '56789', '67891', '78910', '89101', '91011', '10111', '01112', '11121', '11214', '12141', '21414', '14145', '41455', '14555', '45550', '55500', '55008', '50088', '00887']

new_l = [ele for ele in l if '0' not in ele] 

['12345', '23456', '34567', '45678', '56789', '67891', '11121', '11214', '12141', '21414', '14145', '41455', '14555']

答案 1 :(得分:2)

在迭代它时更改列表是个坏主意。相反,您可以创建一个新列表,并仅向l中添加不包含0的元素,如下所示:

res=[]

for e in l:
    if '0' not in e:
        res.append(e)

你也可以用列表理解来做到这一点:

res=[e for e in l if '0' not in e]

答案 2 :(得分:0)

这种情况正在发生,因为每当您有2个需要删除的连续元素时,为前例a b c d而您想删除b和{{ 1}}和当前位置位于c
因此,当您删除b时,列表变为b,当前位置为a c d
<当你在迭代时,当前位置移动到c并且d被跳过。

ChristianDean建议的解决方案是使用您想要保留的值创建一个新列表

c