0

forループのリストの要素を削除する方法は?変数aを再割り当てしないでください。変更しますが、新しい変数は作成しないでください。以下のコードは正しく機能しません

a = [1,2,2,3,2,1,4]
i = 0
for j in a:
    print(j)
    if(j<=2):
        print('deleting ',i)
        del a[i]
    else:
        i+=1     
print(a) #[3, 2, 1, 4]
4

4 に答える 4

4

リストのコピーを反復処理できます

for j in a[:]:

問題を解決する別の方法は

a[:] = [j for j in a if j>2]

a[:]これは、の内容をaリスト内包に置き換える必要があることを示しています

于 2012-09-05T02:44:55.743 に答える
3
a[:]=filter(lambda x:x<=2,a)

フィルタを使用してください。

またはリスト内包

a[:] = [itm for itm in a if itm > 2]

\元のポインタを破壊しないように編集...理由はわかりませんが...完璧なデザインではないようです

于 2012-09-05T02:45:06.690 に答える
2

現在繰り返し処理しているリストの要素を削除しないでください。反復のインデックスを台無しにする可能性があります-Pythonが反復している間にリストが任意に変更された場合、次に反復する「正しい」要素をどのようにして知ることができますか?

代わりに、Joranが提案したように、filter()またはリスト内包表記を使用するか、リストのコピーを繰り返し処理します。

于 2012-09-05T02:46:58.950 に答える
0

他の回答の提案は、リストから要素をフィルタリングすることがループで実行している唯一のことである場合に最適である可能性がありますが、他の多くのことを実行していて、最後にいくつかの項目を誤って削除するだけの場合、リストのインデックスを反復処理することはfilter、リスト内包表記よりも優れたアプローチである可能性があります。

for i in range(len(a)-1, -1, -1): # iterate in reverse order
    val = a[i]

    # do a bunch of stuff with val and/or i

    if (some_condition(val)):
        a.pop(i)

反復は逆であるため、アイテムを削除するときにインデックスが混乱することを心配する必要はありません。

于 2012-09-05T03:00:56.477 に答える