1

このコードは潜在的に危険ですか?それは内側と外側の反復を台無しにしますか?

for a in listA:
            for b in listB: 
                if [... something...]:
                    ... something else...
                    listA.remove(a)
                    listB.remove(b)
                    break
4

3 に答える 3

6

このコードは潜在的に危険ですか?依存します。シーケンスを繰り返しながらサイズを小さくすると、予期しない動作が発生します。

この例を考えてみましょう

listA = [1,2,3,4]

>>> for a in listA:
    listA.remove(a)
    print a

アイテムを削除すると、それを超えるすべてのアイテムが左に押し出されるため、反復することを想定しているアイテムは自動的に次の要素に移動します

最初の反復:

    listA = [1,2,3,4]
             ^
             |
_____________|

    listA.remove(a)


    listA = [2,3,4]
             ^
             |
_____________|


    print a
    (outputs) 1

2回目の反復:

    listA = [2,3,4]
               ^
               |
_______________|

    listA.remove(a)

    listA = [2,4]
               ^
               |
_______________|


    print a
    (outputs) 3

3回目の反復:

    listA = [2,4]
                 ^
                 |
_________________|

(Exits the Loop)
于 2013-02-15T16:24:29.610 に答える
2

繰り返されるシーケンスの変更は、通常、Pythonのアンチパターンです。特定の場合にはその周りで踊ることができますが、必要なアイテムのみを含む新しいリスト(またはdict)を作成できるかどうかを確認するのが最善です。

于 2013-02-15T16:24:06.533 に答える
1

jknupp に同意します。リスト内のアイテムを削除すると、新しいアイテムを作成するよりもコストがかかる可能性があります。ただし、別のトリックは、逆方向に実行することです。

>>> l = range(5)
>>> for a in reversed(l):
...     print a
...     l.remove(a)
... 
4
3
2
1
0
于 2013-02-15T16:36:57.143 に答える