目录
正确答案
首页 后端开发 Python教程 在 Python 中迭代列表时从列表中删除项目时出现奇怪的结果

在 Python 中迭代列表时从列表中删除项目时出现奇怪的结果

Feb 09, 2024 am 10:10 AM
隐式转换

在 Python 中迭代列表时从列表中删除项目时出现奇怪的结果

问题内容

我有这段代码:

numbers = list(range(1, 50))

for i in numbers:
    if i < 20:
        numbers.remove(i)

print(numbers)
登录后复制

但是,我得到的结果是:

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]

当然,我希望结果中不会出现低于 20 的数字。看起来我在删除时做错了什么。


正确答案


您在迭代列表时正在修改列表。这意味着第一次循环时,i == 1,因此1被从列表中删除。然后for循环转到列表中的第二项,它不是2,而是3!然后将其从列表中删除,然后 for 循环继续执行列表中的第三项,现在是 5。依此类推。也许这样更容易可视化,用 ^ 指向 i 的值:

[1, 2, 3, 4, 5, 6...]
 ^
登录后复制

这是列表最初的状态;然后 1 被删除,循环转到列表中的第二项:

[2, 3, 4, 5, 6...]
    ^
[2, 4, 5, 6...]
       ^
登录后复制

等等。

没有好的方法可以在迭代列表时改变列表的长度。你能做的最好的事情就是这样:

numbers = [n for n in numbers if n >= 20]
登录后复制

或者这个,用于就地更改(括号中的东西是一个生成器表达式,它在切片分配之前隐式转换为元组):

numbers[:] = (n for n in numbers if n >= 20)
登录后复制

如果您想在删除 n 之前对其执行操作,您可以尝试的一个技巧是:

for i, n in enumerate(numbers):
    if n < 20:
        print("do something")
        numbers[i] = None
numbers = [n for n in numbers if n is not None]
登录后复制

以上是在 Python 中迭代列表时从列表中删除项目时出现奇怪的结果的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

java中short的用法 java中short的用法 May 07, 2024 am 03:33 AM

short 是 Java 中一种表示 16 位有符号整数的原始数据类型,其范围为 -32,768 到 32,767。它常用于表示小整数,如计数器或 ID,并支持基本算术运算和类型转换。但由于 short 是一种有符号类型,使用除法时需谨慎,以避免溢出或下溢。

sql中ifnull的用法 sql中ifnull的用法 Apr 28, 2024 am 09:57 AM

IFNULL 函数用于检查表达式是否为 NULL,如果是则返回指定的默认值,否则返回表达式的值。它可以防止空值导致错误,允许操作空值,提高查询的可读性。用法包括:将空值替换为默认值、排除空值进行计算和嵌套使用处理多个空值情况。

java中的char是什么意思 java中的char是什么意思 May 01, 2024 pm 06:15 PM

Java 中的 char 类型用于存储单个 Unicode 字符,占 2 个字节,范围从 U+0000 到 U+FFFF,主要用于存储文本字符,可以通过单引号或 Unicode 转义序列初始化,可参与比较、相等性、不相等性和连接运算,可隐式转换为 int 类型,也可以显式转换为 Character 对象。

c语言怎么算除法 c语言怎么算除法 Apr 13, 2024 pm 09:12 PM

C 语言中,除法运算符 / 的行为取决于操作数的数据类型:整数除法:操作数为整数时,进行整数除法,结果向下取整。浮点数除法:操作数为浮点数时,进行浮点数除法,结果为浮点数。类型转换:一个操作数为整数,另一个不是时,整数会隐式转换为浮点数,然后进行浮点数除法。除数为 0:除数为 0 时产生数学误差。取模运算:使用 % 运算符进行取模运算,而非除法取模。

mysql中*是什么意思 mysql中*是什么意思 Apr 26, 2024 am 07:21 AM

MySQL 中的星号 (*) 表示“所有”,具有不同用法:选择所有列选择所有行JOIN 表LIKE 子句的通配符REGEXP 子句的量词隐式类型转换

oracle中(+的用法 oracle中(+的用法 May 08, 2024 pm 08:12 PM

Oracle 中加号(+)运算符可用于:连接字符串、数字、日期和时间间隔;处理 NULL 值,将 NULL 转换为非 NULL 值;转换数据类型为字符串类型。

C++ 函数重载的匹配规则是什么? C++ 函数重载的匹配规则是什么? Apr 27, 2024 am 08:27 AM

C++函数重载匹配规则如下:匹配调用中参数数量和类型。参数顺序必须一致。constness和引用的修饰符必须匹配。可使用默认参数。

一起来探索隐式类型转换的常见应用场景! 一起来探索隐式类型转换的常见应用场景! Jan 11, 2024 pm 04:45 PM

让我们一起探讨隐式类型转换的常见应用场景!导言:在编程语言中,隐式类型转换是一种自动执行的数据类型转换过程。在一些编程语言中,这种转换是隐含进行的,无需显式地告诉编译器或解释器进行转换。隐式类型转换在编程中拥有广泛的应用场景,本文将针对其中一些常见的应用场景进行讨论。数值计算中的隐式类型转换在数值计算中,经常需要进行不同类型的数据之间的运算。当不同类型的数据

See all articles