8

リストから奇数を取り出し、偶数のみのリストを返す単純な関数を作成しています。

def purify(numbers):
for i in numbers:
    if i%2!=0:
       numbers.remove(i)
return numbers    

print purify([4,5,5,4])

上に当てはめると

戻り値: [4, 5, 4] 2 番目の 5 が削除されないのはなぜですか?

問題に対する別の方法を探しているのではなく、なぜこれが起こるのかを理解するためにもっと探しています。

これがばかげている場合は、ありがとう、申し訳ありません..ジョー

4

6 に答える 6

26

アイテムを削除すると、後続のアイテムが 1 つ左に移動します。これにより、ループで一部のアイテムがスキップされます。

ところで、そのコードを書くためのより慣用的な方法は

numbers = [num for num in numbers if num % 2 == 0]
于 2013-08-13T19:01:05.397 に答える
9

皮肉なことに、言及されていないオプションの1つは次のとおりfilterです。

>>> filter(lambda x: not x % 2, [4,5,5,4])
[4, 4]
于 2013-08-14T08:47:51.780 に答える
1

あなたはほとんどそれを持っています。リストのコピーを反復処理する番号の for i の後に [:] を追加するだけです。

def purify(numbers):
    for i in numbers[:]:
        if i%2!=0:
            numbers.remove(i)
    return numbers    

print purify([4,5,5,4])

以下に良い説明があります

Pythonは2つのリストから重複を削除します

于 2013-08-13T19:06:58.513 に答える
0

より明確な図を得るには、各反復でリストを印刷し、リストに何が起こっているかを確認し、反復がどのように継続するかを確認します。

# i have taken all odd number to try to remove all numbers from list
>>> list = [1,3,5,7]
>>> for num in list:
...     if num % 2 != 0:
...         list.remove(num)
...     print(list)
...
[3, 5, 7]
[3, 7]

各 remove() で、要素が 1 つ左に移動したことがわかります。

于 2013-08-13T19:22:54.883 に答える