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