すべての要素をあるリストから別のリストに昇順で転送したい。これは私のコードです:
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=[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]
なぜ途中で止まるのかわからないので、助けてください...ありがとう!
これを行うだけです:
p = sorted(l)
#l = [] if you /really/ want it to be empty after the operation
l
不安定な動作が発生する理由は、シーケンスを反復処理するときにシーケンスのサイズを変更しているため、要素をスキップすることになります。
メソッドを修正したい場合は、次のようにします。
for x in l[:]:
l[:]
のコピーを作成しますl
。これは、元の に対して作業を行う際に安全に反復できますl
。
これを試して:
p = []
while len(l) > 0:
p.append(min(l))
l.remove(min(l))
while
代わりに使用for
すると、リストを繰り返し処理しているときにリストを変更できなくなります。
ええ、あなたのリストが短いことを願っています。そうしないと、min() を実行すると、遅いコードが生成されます。
リストが長い場合は、ヒープ (標準ライブラリの EG heapq) またはツリー (EG: https://pypi.python.org/pypi/red-black-tree-mod ) または treap (EG: https://pypi.python.org/pypi/treap/ )。
あなたがしていることについては、minだけでなく任意の値に繰り返しアクセスできるようにする必要があるなど、省略したストーリーの一部がない限り、heapqがいいと思います。
元のソートされていない配列を保持する場合は、l のコピーを使用します。
詳細については、この回答を確認してください。https://stackoverflow.com/a/1352908/1418255