在python 3中从列表中删除值

在python 3中从列表中删除值,python,list,function,python-3.x,Python,List,Function,Python 3.x,我想编写一个函数,从列表中删除偶数(例如xs=[1,2,3,4,5,6]),然后返回剩余列表的值。需要帮助。非常感谢。 注意:我不能使用任何内置函数,如remove sort等,只能使用delete语句。由于您需要返回剩余列表,因此不应删除,而应进行筛选: [v for v in xs if v % 2 == 1] 这将创建一个包含所有奇数的列表: >>> xs = [1, 2, 3, 4, 5, 6] >>> [v for v in xs if v % 2

我想编写一个函数,从列表中删除偶数(例如xs=[1,2,3,4,5,6]),然后返回剩余列表的值。需要帮助。非常感谢。
注意:我不能使用任何内置函数,如remove sort等,只能使用delete语句。

由于您需要返回剩余列表,因此不应删除,而应进行筛选:

[v for v in xs if v % 2 == 1]
这将创建一个包含所有奇数的列表:

>>> xs = [1, 2, 3, 4, 5, 6]
>>> [v for v in xs if v % 2 == 1]
[1, 3, 5]

显而易见的方法行不通:

for index, value in enumerate(xs):
    if not value % 2:
        del xs[index]
或者,更糟糕的是,它恰好在这种特殊情况下起作用,但这只是因为你非常幸运(你的老师甚至可能指望你掉进这个陷阱)

为什么??好吧,当你删除i[0]的时候,其他的东西都会下降。因此,当您下次检查
i[1]
时,这不是原始的
i[1]
,而是原始的
i[2]
。您从未检查过原始的
i[1]
,因此无法删除它

这在的文档中以灰色大注释进行了解释*


正如Martijn Pieters所说,解决这一问题的最佳方法是首先不要删除

如果你不在乎改变原来的列表(如果没有其他对象引用同一个列表,并且你的老师不喜欢恶作剧,你也不在乎),只需要创建并返回一个新列表,就像他的答案一样。即使您确实需要修改原始列表,
xs[:]=[v代表v,如果v%2==1]
也可以执行此操作,就像就地删除一样

但是,如果您出于某种原因必须就地删除(听起来这可能是您的作业的一项要求),最简单的方法是从末尾开始反向工作:

for index, value in list(enumerate(xs))[::-1]:
    if not value % 2:
        del xs[index]
因为从列表中删除一个值只会向下移动它后面的值,所以以相反的顺序遍历列表意味着我们永远不会丢失并跳过我们想要测试的元素


*这个解释读起来像是Python1.x中的内容;既然迭代器协议是公开的,他们就不需要讨论将内部计数器保留在某个未指定的位置

xs=[1,2,3,4,5,6]

not_even = []
for i in xs:
    if i%2 != 0:
        not_even.append(i)

print not_even
#output: [1, 3, 5]
您还可以使用列表理解来执行此操作:

[i for i in xs if i%2 != 0]

和到目前为止你试过什么?你被困在哪里了?好吧,既然没有
delete
语句,我想你会不及格的。这只是Martijn Pieters答案的冗长版本,没有解释。