转自:https://blog.csdn.net/cckavin/article/details/83618306  

一.问题描述

 这是在工作中遇到的一段代码,原理大概和下面类似(判断某一个元素是否符合要求,不符合删除该元素,最后得到符合要求的列表):

  1.   a = [ 1, 2, 3, 4, 5, 6, 7, 8]
  2.   for i in a:
  3.   if i> 5:
  4.   pass
  5.   else:
  6.   a.remove(i)
  7.   print(a)

运行结果:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

             [转】Python--遍历列表时删除元素的正确做法 随笔 第1张

二.问题分析

因为删除元素后,整个列表的元素会往前移动,而i却是在最初就已经确定了,是不断增大的,所以并不能得到想要的结果。

三.解决方法

1.遍历在新的列表操作,删除是在原来的列表操作

  1.   a = [ 1, 2, 3, 4, 5, 6, 7, 8]
  2.   print(id(a))
  3.   print(id(a[:]))
  4.   for i in a[:]:
  5.   if i> 5:
  6.   pass
  7.   else:
  8.   a.remove(i)
  9.   print(a)
  10.   print( '-------------------------')
  11.   print(id(a))

运行结果:

[转】Python--遍历列表时删除元素的正确做法 随笔 第2张

2.filter

内建函数filter()官方文档参考:https://docs.python.org/3/library/functions.html#filter

  1.   a = [ 1, 2, 3, 4, 5, 6, 7, 8]
  2.   b = filter( lambda x: x> 5,a)
  3.   print(list(b))

运行结果:

[转】Python--遍历列表时删除元素的正确做法 随笔 第3张

3.列表解析

  1.   a = [ 1, 2, 3, 4, 5, 6, 7, 8]
  2.   b = [i for i in a if i > 5]
  3.   print(b)

运行结果:

[转】Python--遍历列表时删除元素的正确做法 随笔 第4张

4.倒序删除

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

  1.   a = [ 1, 2, 3, 4, 5, 6, 7, 8]
  2.   print(id(a))
  3.   for i in range(len(a) -1, -1, -1):
  4.   if a[i] > 5:
  5.   pass
  6.   else:
  7.   a.remove(a[i])
  8.   print(id(a))
  9.   print( '--------------------')
  10.   print(a)

运行结果:

[转】Python--遍历列表时删除元素的正确做法 随笔 第5张

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄