1

Pythonリスト内包表記で副作用を使用することは良い習慣ではないことを私は知っています。しかし、なぜ次のようなことが起こるのか理解できません。

In [66]: tmp = [1,2,3,4,5]; [tmp.remove(elem) for elem in tmp]
Out[66]: [None, None, None]

In [67]: tmp
Out[67]: [2, 4]

これが良い習慣であるかどうかにかかわらず、リスト内包表記の内部は予測可能な何かをするべきではありませんか?上記予測可能である場合、なぜ3つの操作しかremove発生しなかったのか、そしてなぜ偶数のエントリが残っているのかを誰かが説明できますか?

4

2 に答える 2

6

これはlistcompsに関するものではなく、繰り返し処理しているリストから削除することに関するものです。

>>> tmp = [1,2,3,4,5]
>>> for elem in tmp:
...     tmp.remove(elem)
... 
>>> tmp
[2, 4]

これは次のようになります。

>>> tmp = [1,2,3,4,5]
>>> for elem in tmp:
...     print elem, tmp
...     tmp.remove(elem)
...     print elem, tmp
... 
1 [1, 2, 3, 4, 5]
1 [2, 3, 4, 5]
3 [2, 3, 4, 5]
3 [2, 4, 5]
5 [2, 4, 5]
5 [2, 4]

最初に0番目の要素を調べ、1が削除されます。したがって、次の反復では、最初の要素(現在は3)などを削除する必要があります。

于 2012-10-16T23:21:02.940 に答える
-1

リストを直接反復処理しているため、リストから削除することは決して良い考えではありません。編集:おっと、私はリストと辞書を混同していました。ディクショナリにはitereitems()メソッドとiterkeys()メソッドがあります。これは、ディクショナリを反復処理してディクショナリからアイテムを削除するときに使用するものです。

リストの場合、リストコンプ内でこれを実行する場合は、リストをコピーすることをお勧めします。または、代わりに:

[None and tmp.pop(0) for i in xrange(len(tmp))]
于 2012-10-16T23:20:41.860 に答える