在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)
© 版权声明
文章版权归作者所有,未经允许请勿转载。




收藏了,感谢分享