web-dev-qa-db-ja.com

特定の文字を含むリストから要素を削除する

特定の文字のセットを含む(または含まない)リスト内のすべての要素を削除したいのですが、リストを繰り返し処理して、要素を削除するときに問題が発生します。この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セット戻す方法があるかどうかを知りたいです。

32
Vidar

リスト内包表記:

>>> 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']
54
MattH

私があなたを正しく理解していれば、

[x for x in l if "2" not in x]

仕事をするかもしれません。

8
loevborg

起こりうる問題は、for tループでループすると同時にシーケンスを変更しようとしていることです。

0

@Matthに加えて、複数のステートメントを組み合わせたい場合は、次のように記述できます。

>>> l = ['1', '32', '523', '336']
>>> [ x for x in l if "2" not in x and "3" not in x]
['1']
0
J.Doe