前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不要在遍历列表时修改其中的元素

不要在遍历列表时修改其中的元素

作者头像
一只大鸽子
发布2022-12-06 14:17:31
8600
发布2022-12-06 14:17:31
举报

问题引入

之前Q群里有人问了一个问题:如何移除列表s中的满足某个条件的元素? 很自然地写了一个

代码语言:javascript
复制
for x in s:
    if 满足条件: 
        s.remove(x) 

但是运行时发现s中的某些元素被跳过了,实现不了他想要的功能。

我们下面举一个具体的例子说明为什么会这样。比如现在想删除列表s中的偶数: 按照文章开头的写法:

代码语言:javascript
复制
s = [1,2,4,3]

for x in s:
    if x % 2 == 0:
        s.remove(x)

print(s) #  [1, 4, 3]

运行发现,元素2被删除了,但是元素4被跳过了,没有删除。这是因为删除一个元素后,该元素所在位置会空出来,右边的元素会左移填上这个空缺:

当指到元素“2”的时候,发现是偶数,删除2,右边的4,3会左移。但指针不会左移。指针下一次移动就会移动到3,4就被跳过了。

解决方案

1、 遍历s的副本(通过切片或其他方法创建副本),修改s:

代码语言:javascript
复制
s = [1,2,4,3]
for x in s[:]:
    if x % 2 == 0:
        s.remove(x)
print(s)

2、列表推导 直接生成一个需要的新列表。

代码语言:javascript
复制
s = [1,2,4,3]
s = [x for x in s if x%2 != 0]

一个技巧是分配给s的切片,时间上会更高效。

代码语言:javascript
复制
s = [1,2,4,3]
s[:] = [x for x in s if x%2 != 0]

3、利用itertools的filterfalse

代码语言:javascript
复制
from itertools import filterfalse

def even(x):
    return x % 2 == 0
s = [1,2,4,3]
s[:] = filterfalse(even,s)
print(s)

方法2、3 来源:Python 10 Python Basics You Should Know! 作者 Python Engineer:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一只大鸽子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题引入
  • 解决方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档