Python易错知识点: 遍历删除序列元素避坑指南

在Python或其他编程语言中,遍历删除序列元素容易误删、漏删元素甚至可能引起程序异常。

看一个Python示例:

my_list = [1, 2, 3, 4, 5]
for x in my_list:
    if x > 1:
        my_list.remove(x)

# 预期输出[1], 实际输出[1, 3, 5]
print(my_list)

在上述示例中,希望删除所有大于1的元素,实际上却漏删了3和5。

过程如下:

s1: index为0,元素为1,1>1不成立,保留,my_list为[1, 2, 3, 4, 5]。

s2: index为1,元素为2,2>1成立,删除2,my_list为[1, 3, 4, 5]。

s3: index为2,元素为4,4>1成立,删除4,my_list为[1, 3, 5]。

s4: index为3,此时my_list的长度为3,退出循环,my_list最终为[1, 3, 5]。

因此,遍历删除序列元素容易出错的根本缘由是,删除元素引起了index的混乱。

为了避免删除序列元素出现未知错误,一般有以下几种处理方法:

  • 逆序遍历,适合必须原地删除元素的场景。
  • 创建新的序列。
  • 遍历序列的副本。
  • 使用filter。

逆序遍历

my_list = [1, 2, 3, 4, 5]
for x in my_list[::-1]:
    if x > 1:
        my_list.remove(x)

# 输出: [1]
print(my_list)

创建新的序列

my_list = [1, 2, 3, 4, 5]
my_list = [x for x in my_list if x <= 1]

# 输出: [1]
print(my_list)

遍历序列的副本

my_list = [1, 2, 3, 4, 5]
for x in my_list[:]:
    if x > 1:
        my_list.remove(x)

# 输出: [1]
print(my_list)

使用filter

my_list = [1, 2, 3, 4, 5]
my_list = list(filter(lambda x: x <= 1, my_list))

# 输出: [1]
print(my_list)
© 版权声明

相关文章

1 条评论

  • 头像
    九十九 读者

    收藏了,感谢分享

    无记录
    回复