特定の文字のセットを含む(または含まない)リスト内のすべての要素を削除したいのですが、リストを繰り返し処理して、要素を削除するときに問題が発生します。この2つのほぼ等しい例を以下に示します。ご覧のとおり、削除する必要のある2つの要素が互いに直接続いている場合、2番目の要素は削除されません。
Pythonでこれを行う非常に簡単な方法があると確信していますので、誰かがそれを知っているなら、私を助けてください-私は現在、リスト全体のコピーを作成し、一方を反復し、他方の要素を削除しています...私が推測する良い解決策
>>> l
['1', '32', '523', '336']
>>> for t in l:
... for c in t:
... if c == '2':
... l.remove(t)
... break
...
>>> l
['1', '523', '336']
>>> l = ['1','32','523','336','13525']
>>> for w in l:
... if '2' in w: l.remove(w)
...
>>> l
['1', '523', '336']
理解した:
>>> l = ['1','32','523','336','13525']
>>> [x for x in l if not '2' in x]
['1', '336']
ただし、lでxを使用する場合、反復を1セット戻す方法があるかどうかを知りたいです。
リスト内包表記:
>>> l = ['1', '32', '523', '336']
>>> [ x for x in l if "2" not in x ]
['1', '336']
>>> [ x for x in l if "2" in x ]
['32', '523']
私があなたを正しく理解していれば、
[x for x in l if "2" not in x]
仕事をするかもしれません。
起こりうる問題は、for tループでループすると同時にシーケンスを変更しようとしていることです。
@Matthに加えて、複数のステートメントを組み合わせたい場合は、次のように記述できます。
>>> l = ['1', '32', '523', '336']
>>> [ x for x in l if "2" not in x and "3" not in x]
['1']