pythonループリスト複数の要素のピットを削除

1392 ワード

次のコードで、リストを巡り、リストの偶数を削除した場合、結果は予想と一致しません.
a = [11, 20, 4, 5, 16, 28]
for i in a:
    if i % 2 == 0:
        a.remove(i)
print a

結果は次のとおりです.
>>> [11, 4, 5, 28]

偶数4と28は削除されていません.なぜなら、forループがリストを巡るとき、要素のインデックスに従って要素に順次アクセスしているからです.そのうちの1つの要素を削除すると、後ろの要素が順次前に移動します.つまり、インデックス1の要素20を削除すると、アクセスインデックスが2の要素になりますが、要素20を削除すると、後ろの要素が順次前に移動し、要素4のインデックスが1になり、アクセスしません.このときアクセスした要素が5であり,要素28が削除されなかった理由も同様である.
 
この問題を解決するには、次の2つの方法があります.
ぎゃくじゅんかんループ
a = [11, 20, 4, 5, 16, 28]
for i in range(len(a)-1, -1, -1):
    if a[i] % 2 == 0:
        del a[i]

ろ過関数
a = [11, 20, 4, 5, 16, 28]
b = filter(lambda x: x % 2 != 0, a)

私たちが削除するのは偶数で、残っているのは奇数なので、奇数をフィルタして新しいリストbに保存します.
転載先:https://www.cnblogs.com/lucky-heng/p/10545197.html