开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情
在开发场景中,python3 遍历list并删除其中部分元素是很常见的场景。
我们不妨假设一个场景:现在有一个list [1,2,4,-1,-4,1,9,-7,0], 如何删除list中为负数的元素。
聪明如我,不难想到,遍历判断直接删除呗!
l = [1,2,4,-1,-4,1,9,-7,0]
for item in l:
if item < 0:
l.remove(item)
print(l)
soeasy!我们运行一下,看一下输出:
[1, 2, 4, -4, 1, 9, 0]
Wow~ 有那么点问题
remove 函数用于移除列表中某个值的第一个匹配项
好办,那我使用index删除。
l = [1,2,4,-1,-4,1,9,-7,0]
for (i, item) in enumerate(l):
if item < 0:
del l[i]
print(l)
再来一波:
[1, 2, 4, -4, 1, 9, 0]
额额。貌似不对,我们不妨打印list debug 一下:
l = [1,2,4,-1,-4,1,9,-7,0]
for (i, item) in enumerate(l):
print(l)
if item < 0:
del l[i]
print(l)
python3 test_list.py
[1, 2, 4, -1, -4, 1, 9, -7, 0]
[1, 2, 4, -1, -4, 1, 9, -7, 0]
[1, 2, 4, -1, -4, 1, 9, -7, 0]
[1, 2, 4, -1, -4, 1, 9, -7, 0]
[1, 2, 4, -4, 1, 9, -7, 0]
[1, 2, 4, -4, 1, 9, -7, 0]
[1, 2, 4, -4, 1, 9, -7, 0]
[1, 2, 4, -4, 1, 9, 0]
能看出来删除后其实 list 实在变化的,导致部分元素漏删了。
那么到底如何正确操作呢?
filter
l = [1,2,4,-1,-4,1,9,-7,0]
def filter_small(item):
if item < 0:
return False
return True
tmplist = filter(filter_small, l)
print(list(tmplist))
需要注意Python2和Python3的filter是有区别哈!啥区别?【自行搜索,我不熟悉 python2!!】
[1, 2, 4, 1, 9, 0]
语法糖
l = [1,2,4,-1,-4,1,9,-7,0]
l = [x for x in l if x >= 0]
print(l)
注意这里条件,是>=0,就是把非负数保留。
倒序遍历
正向遍历删除元素index变化,那我倒序遍历没毛病吧
l = [1,2,4,-1,-4,1,9,-7,0]
for item in range(len(l) - 1, -1, -1):
if l[item] < 0:
del l[item]
print(l)
当然了,其实还有其他方法,比如创建个新的 list,判断后插入,但逻辑清晰,这个比较简单我就不写代码了。
关于list遍历删除就介绍这么多了,写完代码务必老老实实各种情况测试好,不要想当然,自以为是,就匆匆发布哟!