在Python中移除列表中的负元素
我正在尝试写一个函数,目的是从一个列表中去掉所有负数,但不想用 .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 的解决方案,能更好地实现你的问题...