2013-11-04 33 views
-4

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

+0

还有呢?你试过什么了?你卡在哪里? –

+4

那么,因为没有'delete'语句,我猜你会失败的任务。 – abarnert

回答

2

,因为你需要归还剩余列表中,你应该不会删除,而是过滤:

[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] 
1

最显而易见的方法没有按” t工作:

for index, value in enumerate(xs): 
    if not value % 2: 
     del xs[index] 

或者,更糟糕的是,它发生在这种特殊情况下,但只是因为你得到了非常幸运的(你的老师甚至可能会指望你陷入这个陷阱)。

为什么?那么,当你del i[0],这转移一切下来。所以当你下次检查i[1]时,那不是原来的i[1],而是原来的i[2]。你永远不会检查,因此永远不能删除,原来i[1]

这是在文档中的一个很大的灰色音符为for解释。*


这个最好的解决办法是,为的Martijn Pieters的说,不摆在首位删除。

如果你不关心变异原始列表(如果没有其他对象有对同一列表的引用,并且你的老师不喜欢技巧问题,你不关心),只需创建并返回一个新的清单,如他的回答。即使你需要改变原来的列表,xs[:] = [v for v in xs if v % 2 == 1]将做到这一点,就像删除就地。

但是如果你必须就地删除由于某种原因(这听起来像力量是你的任务的要求),最简单的方法是从末尾向后工作:

for index, value in list(enumerate(xs))[::-1]: 
    if not value % 2: 
     del xs[index] 

由于从列表中删除一个值只会将其后的值向下移动,以相反的顺序通过列表意味着我们永远不会迷路并跳过我们想要测试的元素。


*该解释类似于Python 1.x中的内容;现在的迭代器协议是公开的,他们并不真正需要谈一谈保持内部计数器在某个不确定的地方...

0
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] 
+0

这只是Martijn Pieters的答案的一个更加冗长的版本,没有解释。 – abarnert