Python列表过滤

Python列表过滤,python,list,Python,List,有人能解释一下为什么这段代码只从列表中删除了一个元素,而不是我所期望的每个元素吗 所以我有一个列表,假设它是:[1,2,'a','b'] 我想从列表中删除每个字符串 def filter_list(l): for i in l: if type(i) == str: l.remove(i) filter_list([1,2,'a','b']) 所以在这之后,我收到=[1,2,'b'],这让人困惑。请检查: l = [1,2,'a','b'] pr

有人能解释一下为什么这段代码只从列表中删除了一个元素,而不是我所期望的每个元素吗
所以我有一个列表,假设它是:[1,2,'a','b']
我想从列表中删除每个字符串

def filter_list(l):
    for i in l:
        if type(i) == str:
           l.remove(i)

filter_list([1,2,'a','b'])
所以在这之后,我收到=[1,2,'b'],这让人困惑。

请检查:

l = [1,2,'a','b']
print([item for item in l if isinstance(item, int)])
我建议您使用isinstance内置函数而不是类型。此外,最好检查是否为整数,以防列表中的项与字符串或整数不同

如果要删除它,只需在旧列表上分配新列表即可

l = [1,2,'a','b']
l = [item for item in l if isinstance(item, int)]
print(l)
为什么您不能跳过循环: 让我解释一下

def filter_list(l):
    for index, i in enumerate(l):
        if type(i) == str:
           l.remove(i)
    return l
filter_list([1,2,'a','b'])
第一次迭代for循环的索引为0:
i
变为1,无需删除它

第二次迭代for循环的索引为1:
i
变为2,无需删除它

第三次迭代for循环的索引为2:
i
变为
'a'
,需要将其删除

此时,我们只是删除了
'a'
。列表的长度已更改。 减少了1。新列表变成了
[1,2,'b']
,因为我们删除了
'a'

第4次迭代for循环的索引为3: 因为我们在上一次迭代中删除了变量,所以列表的索引不再是3。循环将引发StopIteration错误(IndexError),并中断

这就是我们无法正确执行此操作的原因。

Lambda函数:

[*filter(lambda x: isinstance(x, int), l)]
数据:


因为你正在修改你正在迭代的列表,所以我应该如何删除每个字符串?尽管如此,为什么我不能循环这个?我试图解释为什么:)为什么被否决?我看不到这个解决方案或这个问题在任何地方重复(以其确切形式)。
l = [1,2,'a','b']