問題:
Python の for ループ中にリストを変更することは、一般的に推奨されません。ただし、リスト内の文字列を変更する必要がある場合はどうすればよいでしょうか?これらの変更可能な値の置換は、禁止された変更としてカウントされますか?
回答:
既に反復処理されたリスト内の要素を変更する限り、それは禁止された変更とみなされます。許容できる。例:
a = ['a',' b', 'c ', ' d '] for i, s in enumerate(a): a[i] = s.strip() print(a) # -> ['a', 'b', 'c', 'd']
このコードはリスト a を反復処理し、各文字列から空白を削除します。新しいリストを作成して元のリストに割り当てることはありません。
ただし、反復中にリスト内の項目数を変更するのは危険です。例:
b = ['a', ' b', 'c ', ' d '] for i, s in enumerate(b): if s.strip() != b[i]: # leading or trailing whitespace? del b[i] print(b) # -> ['a', 'c '] # WRONG!
このコードは、先頭または末尾に空白がある要素をリスト b から削除しようとします。残念ながら、要素を削除すると後続の反復のインデックス作成が中断されるため、この処理は失敗します。
注意:
説明したようにリスト内の要素を安全に変更できることに注意することが重要です。要素の数を増減しようとすると、エラーが発生する可能性があります。
インプレース削除:
反復中にエントリを効果的に削除したい場合は、リスト内包表記を使用します:
b = ['a',' b', 'c ', ' d '] b[:] = [entry for entry in b if entry.strip() == entry] print(b) # -> ['a'] # CORRECT
このコード先頭または末尾に空白がないエントリのみを含む新しいリストを作成し、不要な要素を効果的に削除します「その場で」
以上がPython での反復中にリスト内の文字列を安全に変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。