先看两种错误遍历删除演示
错误演示一:要求删除除了4以外的元素
lis = [1,2,3,4]
for i in lis:
print(i)
print("删除前",lis,id(lis))
if i != 4:
lis.remove(i)
print("删除后",lis,id(lis))
print(lis)
上面代码乍一看好像没问题,但是实际的输出结果却是[2, 4],因为删除0号索引的1以后,该删除1号索引了,而此时列表已经变成[2,3,4],再删除1号索引就把3删除了,就是[2,4]
**输出结果**:
1 删除前 [1, 2, 3, 4] 1775562551296 删除后 [2, 3, 4] 1775562551296 3 删除前 [2, 3, 4] 1775562551296 删除后 [2, 4] 1775562551296 [2, 4]
对于上面的需求,有多种解决方式,开放一下思路,这里列举4种
**解决方案一**:
remove时候元素前移可以通过将要保留的元素添加到一个新的列表里面,实现起来就比较简单
lis = [1,2,3,4] new_lis = [] for i in lis: if i == 4: new_lis.append(i) print(new_lis) # 输出结果 [4]
**解决方案二**:
你也可以对列表倒序遍历删除,这样元素前移其实不影响删除
lis = [1,2,3,4] for i in range(len(lis)-1,-1,-1): if lis[i] != 4: lis.remove(lis[i]) print(lis) # 输出结果 [4]
**解决方案三**:
再或者可以使用filter过滤函数
lis = [1,2,3,4] lis = filter(lambda x:x !=4,lis) print(list(lis)) # 输出结果 [4]
**解决方案四**:
再或者也可以用列表推导式
lis = [1,2,3,4] lis = [ i for i in lis if i !=4] print(lis) # 输出结果 [4]



