0

すべての要素をあるリストから別のリストに昇順で転送したい。これは私のコードです:

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]

なぜ途中で止まるのかわからないので、助けてください...ありがとう!

4

4 に答える 4

7

これを行うだけです:

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

l 不安定な動作が発生する理由は、シーケンスを反復処理するときにシーケンスのサイズを変更しているため、要素をスキップすることになります。

メソッドを修正したい場合は、次のようにします。

for x in l[:]: 

l[:]のコピーを作成しますl。これは、元の に対して作業を行う際に安全に反復できますl

于 2013-11-04T04:02:30.397 に答える
1

これを試して:

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

while代わりに使用forすると、リストを繰り返し処理しているときにリストを変更できなくなります。

于 2013-11-04T04:03:58.417 に答える
0

ええ、あなたのリストが短いことを願っています。そうしないと、min() を実行すると、遅いコードが生成されます。

リストが長い場合は、ヒープ (標準ライブラリの EG heapq) またはツリー (EG: https://pypi.python.org/pypi/red-black-tree-mod ) または treap (EG: https://pypi.python.org/pypi/treap/ )。

あなたがしていることについては、minだけでなく任意の値に繰り返しアクセスできるようにする必要があるなど、省略したストーリーの一部がない限り、heapqがいいと思います。

于 2013-11-04T04:56:48.980 に答える
0

元のソートされていない配列を保持する場合は、l のコピーを使用します。

詳細については、この回答を確認してください。https://stackoverflow.com/a/1352908/1418255

于 2013-11-04T04:03:54.770 に答える