0

ここで、2 つのリストから値をフィルター処理する方法についての投稿を読みました。Python: 1 つのリストの内容に基づいて 2 つのリストから値を削除する方法

forandを使用して自分でコードを書こうとしましzipたが、結果が間違っています。これを理解するのを手伝ってくれる人はいますか?

xVar = [1, 2, 3, 4, 5, 6, 7]
yVar = [11, 22, 33, 44, 55, 66, 77]

z = zip(xVar, yVar)
zFiltered = [(x, y) for x, y in z if y < 50]
print zFiltered # Correct, prints [(1, 11), (2, 22), (3, 33), (4, 44)]

for (x, y) in z:
    if y > 50:
        z.remove((x, y))

print z # Wrong, prints [(1, 11), (2, 22), (3, 33), (4, 44), (6, 66)]

なぜこうなった?を使用しようとしたところ、の値がである がスキップpdbされた後、インデックスを介して割り当てていることがわかりました。削除すると元のインデックスに違反します。そうであれば、ここでステートメントを使用して同じことを行うにはどうすればよいですか? ここに他の落とし穴はありますか?z.remove((5, 55))(x, y)(7, 77)(6, 66)for(x, y)(5, 55)for

4

2 に答える 2

2

問題は、反復処理中にリストからアイテムを削除すると、その内部構造が狂ってしまい、アイテムがスキップされることです。この問題を回避する簡単な方法は、 を追加してリストのコピーを作成すること[:]です。

for (x, y) in z[:]:
    ...

元のリストは反復されていないため、元のリストに変更を加えることができます。

于 2013-09-26T06:24:01.077 に答える