首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

大家好,欢迎来到 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 整除的话,就从列表里删除。

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

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

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

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

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

所以,

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

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

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

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

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

这就方便多了。

【教程】: python

【答疑】: 666

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O5Ov7XslnNn8BxkzVyQuRMQA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券