首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -列表过滤

Python -列表过滤
EN

Stack Overflow用户
提问于 2020-05-10 09:25:07
回答 2查看 285关注 0票数 0

有人能向我解释为什么这段代码只从列表中删除一个元素,而不是我所期望的每个元素吗?

所以我有一个列表,假设是: 1,2,'a','b‘

我想从列表中删除每个字符串。

代码语言:javascript
复制
def filter_list(l):
    for i in l:
        if type(i) == str:
           l.remove(i)

filter_list([1,2,'a','b'])

在这之后,我收到= 1,2,'b‘,这是令人困惑的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-10 09:28:07

看看这个:

代码语言:javascript
复制
l = [1,2,'a','b']
print([item for item in l if isinstance(item, int)])

我建议您使用is实例内置函数,而不是类型。此外,如果您的列表中有一个与字符串或整数不同的项,则最好检查是否为整数。

如果您想要删除它,可以简单地在旧列表上分配新列表。

代码语言:javascript
复制
l = [1,2,'a','b']
l = [item for item in l if isinstance(item, int)]
print(l)

为什么你不能超过循环:让我解释。

代码语言:javascript
复制
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)并中断。

这就是为什么我们不能正确地这样做的原因。

票数 0
EN

Stack Overflow用户

发布于 2020-05-10 10:02:20

Lambda功能:

代码语言:javascript
复制
[*filter(lambda x: isinstance(x, int), l)]

数据:

代码语言:javascript
复制
l = [1,2,'a','b'] 
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61709736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档