python列表元素的移动_关于python:将列表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]

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

在迭代数据结构时改变它是一个坏主意。为了快速修复,迭代l的副本,比如for x in l[:]:。

您可以使用sorted()。

就这么做:

p = sorted(l)

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

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

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

for x in l[:]:

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

这是最简单的,最Python的方式。不知道为什么每个人都要把事情复杂化。另外,如果您不想假定p为空,并且想附加l的已排序元素,可以执行p += sorted(l)。

试试这个:

p = []

while len(l) > 0:

p.append(min(l))

l.remove(min(l))

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

有帮助!谢谢!

我要指出的是,这个算法是O(n**2),在这一点上是一个效率低下的O(n**2)。至少在本地保存min(l),这样您就不会计算两次。

当然,答案实际上是为了显示迭代时不修改的值。运行时与OP相同(如果它按他/她预期的方式工作)。

@戴夫,我知道,不是打你。只是给手术室的一个提示,尽管他可能并不十分关心时间的复杂性。

哎呀,我希望你的名单很短。否则,所有的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

你可能感兴趣的:(python列表元素的移动)