Удаление элементов из списка, содержащего определенные символы - PullRequest
32 голосов
/ 05 августа 2010

Я хочу удалить все элементы в списке, который содержит (или не содержит) набор определенных символов, однако я сталкиваюсь с проблемами, перебирая список и удаляя элементы по мере продвижения. Два почти равных примера этого приведены ниже. Как вы можете видеть, если два элемента, которые должны быть удалены, непосредственно следуют друг за другом, второй элемент не удаляется.

Я уверен, что в 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']

Хотелось бы знать, есть ли способ вернуть итерацию обратно на один набор при использовании для x в l.

Ответы [ 4 ]

53 голосов
/ 05 августа 2010

Список представлений:

>>> 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']
8 голосов
/ 05 августа 2010

Если я вас правильно понимаю,

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

может сделать работу.

0 голосов
/ 12 марта 2019

В дополнение к @Matth, если вы хотите объединить несколько операторов, вы можете написать:

>>> l = ['1', '32', '523', '336']
>>> [ x for x in l if "2" not in x and "3" not in x]
['1']
0 голосов
/ 05 августа 2010

Проблема, с которой вы можете столкнуться, заключается в том, что вы пытаетесь изменить последовательность l одновременно с ее циклом в цикле t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...