Python で反復処理やリストからの削除を行うと予期しない結果が生じる理由
Oct 19, 2024 am 09:55 AM反復中にリストから項目を削除する - 典型的なイディオムが失敗する理由
プログラミングでは、リストを反復処理して削除するのが一般的です。必要に応じて項目を選択します。ただし、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']
説明
この理由動作は、反復中のリスト変更の Python の処理にあります。ドキュメントには明確に次のように記載されています:
「ループ内で反復されているシーケンスを変更するのは安全ではありません [...] 反復しているリストを変更する必要がある場合は [...] 反復する必要があります"
提供されたコードでは、反復処理中にリストの文字を変更しようとしています。この状況を処理するための Python の設計では、削除するたびに 1 つおきの項目をスキップして反復が続行されます。
コードの書き換え
この問題を回避するには、コードを次のようにする必要があります。リストを反復処理する前にリストのコピーを作成するように書き換えられました。これを実現するには、いくつかの方法があります。
- del 文字[:]: リストからすべての項目を削除し、事実上空のリストに置き換えます。
- letters[:] = []: del Letters[:] と似ていますが、元のリストを変更する代わりに、新しい空のリストを生成します。
- letters = []: 完全に新しい空のリストを変数の文字に割り当てます。
あるいは、条件に基づいて特定の項目を削除することが目的の場合は、filter() 関数を使用して新しいリストを作成する方が効率的です。必要な項目のみを含むリスト。このアプローチにより、元のリストのコピーを反復処理する必要がなくなります。
以上がPython で反復処理やリストからの削除を行うと予期しない結果が生じる理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









