0

最初のコード:

li = [32,45,23,66,66,89,27]
print li
for k in li:
    if k == 66:
        li.remove(k)
print li

結果:

> [32, 45, 23, 66, 66, 89, 27] 

> [32, 45, 23, 66, 89, 27]

これが私の質問です。最初の66を削除すると、2番目のアイテムと他のアイテムが1つのインデックスに移動し、次k89になります。2番目の66はまだそこにあります。どうすれば削除できますか?

4

3 に答える 3

3

これを行う最も一般的な方法は、元のリストではなく、リストのコピーを反復処理することです。

for k in li[:]:
    #do stuff

ただし、リスト内包表記を使用することを好みます。

[k for k in li if k != 66]
于 2012-05-11T04:03:31.857 に答える
2

リストを繰り返し処理し、繰り返し発生する要素を削除しながら、ループの問題に対する私の回答を参照して、この問題が発生する理由を理解してください。

この場合、次のことができます。

li = [item for item in li if item != 66]

新しいリストを作成します。

リスト内包表記は、リスト全体を1回だけトラバースするのに対し、リスト内包表記は、removeそれぞれがリスト全体をトラバースする必要があるため、多くのことを行う必要がある場合にも高速になります。remove

于 2012-05-11T04:03:39.390 に答える
0

あなたがやりたいのはこれだと思います。だからあなたの場合:

li = [32,45,23,66,66,89,27]
print li
li[:] = [x for x in li if x != 66]
print li

もちろん、通常のforループでそれを実行したいli場合は、いつでも逆 に繰り返すことができます。

li = [32,45,23,66,66,89,27]
print li
for k in reversed(li):
    if k == 66:
        li.remove(k)
print li

ただし、これは非常に非効率的であることに注意してください。remove 最初の出現を検索して削除するためです。したがって、リストを効果的に何度も繰り返すことができます。

于 2012-05-11T04:03:08.690 に答える