在Python中移除列表中的负元素

3 投票
3 回答
2349 浏览
提问于 2025-04-18 02:07

我正在尝试写一个函数,目的是从一个列表中去掉所有负数,但不想用 .remove 或 .del 这些方法。我只想用简单的 for 循环和 while 循环来实现。我不明白为什么我的代码不管用。希望能得到一些帮助。

def rmNegatives(L):
    subscript = 0
    for num in L:
        if num < 0:
            L = L[:subscript] + L[subscript:]
        subscript += 1
    return L

3 个回答

4

如果你愿意的话,也可以使用过滤器。

L = filter(lambda x: x > 0, L)
5

为什么不使用列表推导:

new_list = [i for i in old_list if i>=0]

例子

>>> old_list = [1,4,-2,94,-12,-1,234]
>>> new_list = [i for i in old_list if i>=0]
>>> print new_list
[1,4,94,234]

关于你的版本,你在遍历列表的时候改变了列表里的元素。除非你非常确定自己在做什么,否则一定要避免这样做。

既然你提到这是一个关于while循环的练习,下面的代码也可以正常工作:

def rmNegatives(L):
    i = 0
    while i < len(L):
        if L[i]<0:
            del L[i]
        else:
            i+=1
    return L
1

给你的代码提个醒:

L = L[:subscript] + L[subscript:]

这个不会改变你的列表。例如:

>>> l = [1,2,3,4]
>>> l[:2] + l[2:]
[1, 2, 3, 4]

其他错误:

def rmNegatives(L):
    subscript = 0
    for num in L: # here you run over a list which you mutate
        if num < 0:
            L = L[:subscript] + L[subscript:] # here you do not change the list (see comment above)
        subscript += 1 # you have to do this only in the case, when you did not remove an element from the list
    return L

可以运行的代码是:

def rmNegatives(L):
    subscript = 0
    for num in list(L):
        if num < 0:
            L = L[:subscript] + L[subscript+1:]
        else:
            subscript += 1
    return L

看看 @Aesthete 和 @sshashank124 的解决方案,能更好地实现你的问题...

撰写回答