python3 list如何删除部分元素

63 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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遍历删除就介绍这么多了,写完代码务必老老实实各种情况测试好,不要想当然,自以为是,就匆匆发布哟!