ループを使用してリストから項目を削除するときの予期しない動作に対処する方法は?

Linda Hamilton
リリース: 2024-10-19 11:38:01
オリジナル
361 人が閲覧しました

How to Handle Unexpected Behavior When Removing Items from Lists Using Loops?

リストから項目を削除するときの間違ったループ

リストを反復処理してループ内の項目を削除すると、予期しない動作が発生する可能性があります。次のコードを考えてみましょう:

<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 のドキュメントで説明されています。

[I] ループ内で反復されるシーケンスを変更するのは安全ではありません。反復処理中のリストを変更する必要がある場合は、コピーを反復処理する必要があります。

この特定のケースでは、項目を削除した後に反復変数 i が更新され、その結果、次の項目のインデックスが更新されます。スキップされるループ。

項目を正確に削除するための再書き込み

この動作を修正するには、リストのコピーを反復処理するか、別の方法を使用して項目を削除する必要があります。 。以下に 3 つのオプションがあります:

  1. リスト全体を削除します:
<code class="python">del letters[:]</code>
ログイン後にコピー
  1. リストを空のリストに置き換えます:
<code class="python">letters[:] = []</code>
ログイン後にコピー
  1. 新しいリストを作成します:
<code class="python">letters = []</code>
ログイン後にコピー

または、特定のリストを削除する必要がある場合は、条件に基づいて項目を削除するには、内包表記または filter() 関数を使用してリストをフィルタリングできます。

<code class="python">letters = [letter for letter in letters if letter not in ['a', 'c', 'e', 'g', 'i', 'k']]</code>
ログイン後にコピー
<code class="python">letters = list(filter(lambda letter: letter not in ['a', 'c', 'e', 'g', 'i', 'k'], letters))</code>
ログイン後にコピー

これらのガイドラインに従うことで、Python でリストから項目を正確かつ効率的に削除できます。 .

以上がループを使用してリストから項目を削除するときの予期しない動作に対処する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!