Python遍历列表时删除元素会漏掉一些元素

l_ids=['*123','*234','*345']
for i in l_ids:
    print(i)
    if '*' in i:
        l_ids.remove(i)
print(l_ids)

输出:
*123
*345
[‘*234’]

预期的输出应该是空列表,但是我们发现’*234’被跳过了,因为虽然我们不是通过下标来遍历列表,但是Python解释器处理时是按下标处理的,而且下标的顺序一开始就确定好了,是0,1,2…,当删除’*123’后,整个列表的元素事实已经前移了一位,‘*234’的下标已经变成0,而第二次循环的下标却是1,导致’*234’被跳过。

有很多方法可以解决这个问题,例如拷贝列表,可以参考下面这篇文章:

版权声明:下文为CSDN博主「rehet」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42999479/article/details/105731748

1.最简单的方法

a = list(eval(input()))
x = eval(input())
for i in a[:]:
	if i==x:
		a.remove(i)
print(a)

2.使用filter()函数过滤掉符合指定条件的元素。

a = list(eval(input()))
x = eval(input())
print(list(filter(lambda y: y != x, a)))

3.使用列表解析式。

a = list(eval(input()))
x = eval(input())
b = [i for i in a if i != x]
print(b)

4.利用深拷贝

import copy
a = list(eval(input()))
x = eval(input())
b = copy.deepcopy(a)
for i in a:
    if i == x:
        b.remove(i)
print(b)

Tip:不可以直接b=a,因为这样因为新变量和原变量的物理地址仍旧是相同的。

5.使用while循环

a = list(eval(input()))
x = eval(input())
while x in a:
    a.remove(x)
print(a)

6.倒序删除

a = list(eval(input()))
x = eval(input())
for i in range(len(a)-1,-1,-1):
    if a[i] == x:
        a.remove(x)
print(a)

因为列表总是“向前移”,所以可以倒序遍历,即使后面的元素被修改了,还没有被遍历的元素和其坐标仍保持不变,不过会可能导致遍历长度大于列表的长度。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值