【问题标题】:Move every element from list l to list p将列表 l 中的每个元素移动到列表 p
【发布时间】:2013-11-14 16:47:50
【问题描述】:

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

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()

标签: python


【解决方案1】:

这样做:

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

您出现异常行为的原因是您正在更改序列的大小l在您对其进行迭代时,导致您跳过元素。

如果你想修正你的方法,你会这样做:

for x in l[:]: 

l[:] 创建l副本,您可以在对原始l 执行操作时安全地对其进行迭代。

【讨论】:

  • 这是最简单、最 Pythonic 的方式。不知道为什么每个人都把它复杂化。另外,如果不想假设p为空,想追加l的排序后的元素,可以做p += sorted(l)
【解决方案2】:

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

查看此答案以获取更多信息。 https://stackoverflow.com/a/1352908/1418255

【讨论】:

    【解决方案3】:

    试试这个:

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

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

    【讨论】:

    • 我必须指出,这个算法是O(n**2),而且效率低下的O(n**2)。至少将min(l) 保存在本地,这样您就不会计算两次。
    • 当然,答案的真正目的是展示迭代时不修改的价值。运行时与 OP 的相同(如果它按他/她的预期工作)。
    • @dave 我知道,不是敲你。只是给 OP 的一个说明,尽管他可能并不非常担心时间复杂度。
    【解决方案4】:

    哎呀,我希望你的清单很短。否则,所有这些 min()'ing 将产生一段缓慢的代码。

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

    对于您正在做的事情,我猜 heapq 会很好,除非您遗漏了您的故事的一部分,例如需要能够访问任意值而不仅仅是重复地访问 min。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 2019-10-30
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2018-09-03
      • 1970-01-01
      相关资源
      最近更新 更多