千万不要一边遍历列表一边删除元素

大家好,欢迎来到 Crossin的编程教室 !

今天分享一个看起来很小,但很多人都可能踩过的一个坑。

来看这个例子:

arr = [1, 2, 4, 6, 7, 8, 9]
for i in arr:
    if i % 2 == 0:
        arr.remove(i)
print(arr)

这个代码的意图很简单,就是有一个 list 列表,想删除里面的偶数值。

于是用一个 for 循环遍历列表,然后用 if 判断元素能被 2 整除的话,就从列表里删除。

但令人意外的是,结果里仍然还是有偶数。

0fd08ed4183098322f69455cf9c9c9c2.png

导致这种结果的原因是因为在通过 remove 方法删除元素的时候改变了列表原本的结构:

当 i 遍历到元素 2 时,根据判断删除了这个元素,使得后面的元素索引都向前移了一位

而进入下一次遍历时,i 的值就不是下一个元素 4,而是原本下一个索引位置对应的新元素 6

这就导致元素 4 被跳过了。

a20062ba298f425efbe823178788462c.png

所以,

不要在遍历列表的同时删除元素!

不要在遍历列表的同时删除元素!

不要在遍历列表的同时删除元素!

如果你想删,一种解决办法是手动对遍历的索引进行控制:

arr = [1, 2, 4, 6, 7, 8, 9]
i = 0
while i < len(arr):
    if arr[i] % 2 == 0:
        arr.pop(i)
    else:
        i += 1
print(arr)

但这种解法稍显复杂。所以可以转换一下思路,把不要删的元素添加到一个新的列表中:

arr = [1, 2, 4, 6, 7, 8, 9]
arr2 = []
for i in arr:
    if i % 2 != 0:
        arr2.append(i)
print(arr2)

或者直接用一个列表解析式搞定:

arr = [1, 2, 4, 6, 7, 8, 9]
arr2 = [i for i in arr if i % 2 != 0]
print(arr2)

这就方便多了。

你还有什么遍历删除列表中特定元素的方法?欢迎在评论区讨论。

感谢转发点赞的各位~


_往期文章推荐_

0.1+0.2竟然不等于0.3?!

Python精讲|奇葩的is


【教程】: python

【答疑】: 666

更多资源请在公众号内搜索或留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crossin的编程教室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值