python语法问题

要修改一个列表lista = [1,2,4,4,10,6,7,5,20],用以下代码把其中偶数删除,但最终得到的结果是有部分偶数没有删除,为什么没有删除干净?
for i in lista:
  if i % 2 == 0:
    lista.remove(i)
请用python写一个方法,以最小的代价来把所有偶数都删除,并说明为什么这样写可以删除所有偶数?
如果要在原列表上进行操作,该如何实现这功能?

lis = []
for i in lista:
  if i % 2 != 0:
    lis.append(i)
print(lis)

列表循环不能随便删除元素,你删除某个元素,下次循环索引就不对了,正确简单的写法就是我这样的。有帮助的话采纳一下哦!

  1. 首先为什么没有删除
    在Python中 列表是可变对象.你遍历的时候. idx = 0, idx=1,都没有问题. 此时 你遍历到 idx=2 这个时候 应该删除 idx=2的元素(第一个4)。 这个时候列表的长度会缩短一。 第二个4(开始的时候 idx =3) 此时因为 第一个4(idx=2) 被删除. 所以会往前移动一位 此时 第二个4(idx=3) 的idx 变成 2. 但是 你的迭代器 刚刚 迭代到idx=2了(删除了第一个 4)。 所以该迭代到 idx=3了 此时idx=3 实际上是 10.

要理解for 循环原理,比如第二个元素你删了后,下一个循环第几个元素?正常是第三个元素,但是原来第二个元素被删了,第三个跳到了第二个,但是按for循环的情况他还是自动选择第三个去循环它,解决办法就是用deepcopy方法,复制一个列表,循环它,其他的不变

img

img


方法应该有好几个,目前这个就是最方便的了

顺序循环原址删除会导致删除元素后的所有元素前移一位,于是被删除元素的下一元素无法遍历到
原址修改可考虑倒序循环

lista = [1,2,4,4,10,6,7,5,20]
for i in range(len(lista) - 1, -1, -1):
    if lista[i] % 2 == 0:
        lista.remove(lista[i])

img

img