我正在尝试将此列表中的奇数移动到最后,而不使用外部列表。当我运行代码时,它会移动一半的奇数,并将另一半移到原来的位置。如果我在列表上运行两次代码,整体输出是正确的,但我只需要运行一次,对吧?我做错了什么?
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
感谢。
答案 0 :(得分:1)
这是因为,作为一般规则,您不应该同时迭代并修改同一个列表。指数被抛弃了!
当您浏览并修改列表时,并非实际上所有元素都已循环通过。弹出的a
是一个不同的列表,在您第一次更改列表后会有不同的标记,但您仍然使用原始版本的枚举进行循环。
答案 1 :(得分:1)
您可以使用pythons sorting methods(sorted()
或 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.,您必须从列表末尾开始,然后使用负索引开始。
执行以下代码
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]