4

したがって、私は次のようにリスト内のアイテムを繰り返し処理しています。

for virus in viruses:
    do stuff
    remove virus

インデックスがあれば、delviral [i]を実行でき、コードを微調整して次のようなfor index in range(0, len(viruses))ことを実行できますが、forループ内で実行したい他のことに対して、コードが非常に迅速に醜くなり始めます。 。とにかく、現在繰り返し処理しているウイルスの名前に基づいて削除できるものはありますか?

4

4 に答える 4

10

これはどう:

for virus in viruses[:]:
    # do stuff
    viruses.remove(virus)  # remove "virus" from the original list

viruses[:]リストのコピーを作成しますviruses。注として、list(oldlist)リストをコピーするために使用することもできます(これはもう少し読みやすいと思いますが、どちらでも機能します)。Pythonのリストについて詳しくは、こちらをご覧ください。

于 2012-10-02T21:58:47.883 に答える
5

値でアイテムを削除するには、次を使用しますlist.remove()

リストを反復処理しているときにリストから要素を削除すると、予期しない問題が発生する可能性があるため、コピーを反復処理していることを確認してください。

for virus in viruses[:]:
    # do stuff
    viruses.remove(virus)
于 2012-10-02T21:58:53.877 に答える
1

リストにはメソッドがありremove()、これを使用して要素を値で削除できます。

リストを変更するだけでなく、リストを反復処理する場合はreversed()、を使用する必要があります。そうしないと、反復によっていくつかの要素が失われます。

for virus in reversed(viruses):
    viruses.remove(virus)

簡単な例:

In [203]: lis=range(0,10)

In [206]: for x in reversed(lis):
   .....:     if x%2==0:                #remove even numbers
   .....:         lis.remove(x)
   .....:         
   .....:         

In [207]: lis
Out[207]: [1, 3, 5, 7, 9]

または浅いコピーを使用します。

In [212]: lis=range(10)

In [213]: for x in lis[:]:
    if x%2==0:
        lis.remove(x)
   .....:         
   .....:         

In [216]: lis
Out[216]: [1, 3, 5, 7, 9]
于 2012-10-02T21:52:44.337 に答える
0

オプションの1つはを使用するremove()ことですが、エラーが返される場合があります。もう1つのオプションは、ウイルス(リストと見なされる)をスタック(またはキュー)として扱うことです。

for _ in xrange(len(viruses)):
    virus = viruses.pop()
    # do stuff with virus

viruses代わりに辞書(およびキー)の場合virus、キーを削除する必要があるのは次のとおりです。

import copy
for virus in copy.copy(viruses):
    # do stuff with virus
    del viruses[virus]

詳細については、 http://docs.python.org/tutorial/datastructures.htmlを参照してください。

于 2012-10-02T21:59:54.120 に答える