在Python中将奇数移动到列表末尾,结果奇怪

时间:2015-12-07 20:41:06

标签: python list for-loop

我正在尝试将此列表中的奇数移动到最后,而不使用外部列表。当我运行代码时,它会移动一半的奇数,并将另一半移到原来的位置。如果我在列表上运行两次代码,整体输出是正确的,但我只需要运行一次,对吧?我做错了什么?

a = [3, 4, 55, 13, 6, 19, 33, 10, 11, 45]


for ind, val in enumerate(a):
    if val % 2 != 0:
       a.pop(ind)
       a.append(val)

print a

感谢。

3 个答案:

答案 0 :(得分:1)

这是因为,作为一般规则,您不应该同时迭代并修改同一个列表。指数被抛弃了!

当您浏览并修改列表时,并非实际上所有元素都已循环通过。弹出的a是一个不同的列表,在您第一次更改列表后会有不同的标记,但您仍然使用原始版本的枚举进行循环。

答案 1 :(得分:1)

您可以使用pythons sorting methodssorted() someList sort())并向其传递一个特殊的key函数:

>>> sorted(a, key = lambda element: element%2 != 0)
[4, 6, 10, 3, 55, 13, 19, 33, 11, 45]

这是可能的,因为Python排序保证是稳定的,因此当多个记录具有相同的密钥时,它们的原始顺序将被保留。

答案 2 :(得分:0)

你的方法有两个问题,

  1. 您修改了迭代的列表
  2. 你不测试滑入奇数所占位置的数字本身是奇数
  3. 要避免使用1.,您只需迭代列表的索引,但要避免2.,您必须从列表末尾开始,然后使用负索引开始。

    执行以下代码

    a = [3, 4, 55, 13, 6, 19, 33, 10, 11, 45]
    for i in range(len(a)):
        j = -1-i
        if a[j]%2:
            a.append(a[j]) ; a.pop(j-1) # j-1 because our list is temporarily longer...
    print a
    

    为您提供以下输出

    [4, 6, 10, 45, 11, 33, 19, 13, 55, 3]