关于python:将列表l中的每个元素移动到列表p

Move every element from list l to list p

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

1
2
3
4
5
6
7
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
[1, 2, 3, 4, 5]
[10, 6, 7, 8, 9]

我不知道为什么中途停下来,请帮我一下……谢谢!


就这么做:

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

你行为不稳定的原因是你在迭代过程中改变了序列l的大小,导致你跳过了元素。

如果你想修正你的方法,你可以:

1
for x in l[:]:

l[:]创建了l的副本,您可以在对原始l执行操作时安全地重复该副本。


试试这个:

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

使用while而不是for,可以防止您在迭代列表时修改列表。


哎呀,我希望你的名单很短。否则,所有的min()操作将产生一段缓慢的代码。

如果您的列表很长,您可以尝试堆(如标准库中的heapq)、树(如:https://pypi.python.org/pypi/red-black-tree-mod)或treap(如:https://pypi.python.org/pypi/treap/)。

对于你所做的,我猜堆是很好的,除非你的故事中有你遗漏的部分,比如需要能够访问任意值,而不仅仅是最小值。


如果要保留原始的未排序数组,请使用l的副本。

查看此答案了解更多信息。https://stackoverflow.com/a/1352908/1418255