2013-11-04 99 views
0

我想按升序将每个元素从一个列表转移到另一个列表。这是我的代码:将列表l中的每个元素移动到列表p

l=[10,1,2,3,4,5,6,7,8,9] 
p=[] 
for x in l : 
    p.append(min(l)) 
    l.remove(min(l)) 
print p 
print l 

但它返回这个结果:

[1, 2, 3, 4, 5] 
[10, 6, 7, 8, 9] 

我不知道为什么停在半路上,请帮我...谢谢!

+0

这是一个糟糕的想法,当*你正在迭代它时,改变数据结构*。对于快速修复,迭代l的副本,如'for x in l [:]:' –

+0

您可以使用'sorted()' –

回答

1

试试这个:

p = [] 
while len(l) > 0: 
    p.append(min(l)) 
    l.remove(min(l)) 

使用while代替for防止您修改列表,你遍历它。

+0

它有帮助!谢谢! – Light

+0

我必须指出,这个算法是'O(n ** 2)',并且是一个低效率的'O(n ** 2)'。至少将'min(l)'保存在本地,所以不要计算两次。 – roippi

+0

当然,答案真的是要显示迭代时不修改的价值。运行时与OP的相同(如果按照他/她的意图工作)。 – dave

7

只是这样做:

p = sorted(l) 
#l = [] if you /really/ want it to be empty after the operation 

你得到靠不住的行为的原因是,您要更改序列l的大小,你遍历它,导致你跳过元素。

如果你想修复你的方法,你会怎么做:

for x in l[:]: 

l[:]创建复制的l,其中,而你做的事情原来l你可以放心地迭代。

+1

这是最简单,最具Pythonic的方式。不知道为什么每个人都使它复杂化。另外,如果你不想假设'p'是空的,并且想要附加'l'的排序元素,你可以执行'p + = sorted(l)'。 –

相关问题