我想编写一个从列表中删除偶数的函数(例如xs = [1,2,3,4,5,6]),然后返回剩余的列表。需要帮助。谢谢 注意:我不能使用任何内置函数,如remove sort等,但只能使用delete语句。
答案 0 :(得分: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 :(得分:1)
显而易见的方法不起作用:
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;既然迭代器协议是公共的,他们真的不需要谈论将内部计数器保存在一些未指定的地方......
答案 2 :(得分: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]