ホームページ >バックエンド開発 >Python チュートリアル >Python リストから項目を安全に反復して削除するにはどうすればよいですか?
反復中にリストから項目を削除する危険性を理解する
反復中にリストからすべての要素を削除しようとすると、ユーザーは予期しない動作に遭遇する可能性があります。この問題を説明するコード スニペットを調べてみましょう:
<code class="python">letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] for i in letters: letters.remove(i) print(letters)</code>
不可解なことに、このコードの出力は ['b', 'd', 'f', 'h', 'j', 'l ']。すべての要素を削除するのではなく、1 つおきの要素を削除したようです。
根本原因
このような場合、Python のリスト内包表記は異なる動作をします。ドキュメントで明らかにされているように、「ループ内で反復されるシーケンスを変更するのは安全ではありません。」反復処理中にリストから要素を削除すると、次の要素のインデックスが不正確になります。その結果、ループは要素をスキップし、観察されたパターンにつながります。
安全な代替手段
リストからすべての要素を安全に削除するには、いくつかのオプションがあります。
del の使用: このアプローチでは、すべての要素が削除され、空のリストが残ります:
<code class="python">del letters[:]</code>
文字の使用[:] = []: これにより、新しい空のリストが作成され、古いリストが破棄されます:
<code class="python">letters[:] = []</code>
新しいリストの割り当て: これにより、別のオブジェクト:
<code class="python">letters = []</code>
リストのフィルタリング: 要素を選択的に削除する場合、リストのコピーを反復処理することをお勧めします:
<code class="python">commands = ["ls", "cd", "rm -rf /"] for cmd in commands[:]: if "rm " in cmd: commands.remove(cmd)</code>
または、リストをより簡潔にフィルタリングできます:
<code class="python">commands = [cmd for cmd in commands if not is_malicious(cmd)]</code>
以上がPython リストから項目を安全に反復して削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。