Я пытаюсь понять, смогу ли я улучшить этот код, используя генераторы списков.
Допустим, у меня есть следующие списки:
a_list = [
'HELLO',
'FOO',
'FO1BAR',
'ROOBAR',
'SHOEBAR'
]
regex_list = [lambda x: re.search(r'FOO', x, re.IGNORECASE),
lambda x: re.search(r'RO', x, re.IGNORECASE)]
В основном я хочу добавить все элементы, которые не имеют совпадений в regex_list, в другой список.
E.g. ==>
newlist = []
for each in a_list:
for regex in regex_list:
if(regex(each) == None):
newlist.append(each)
Как я могу сделать это, используя понимание списка? Это вообще возможно?
Ответ 1 · рейтинг 18 · David Z
Конечно, я думаю, что это должно сделать это
newlist = [s for s in a_list if not any(r(s) for r in regex_list)]
EDIT: при ближайшем рассмотрении я заметил, что ваш пример кода фактически добавляет в новый список каждую строку в a_list, которая не соответствует всем регулярным выражениям - и более того, это добавляет каждую строку один раз для каждого регулярного выражения, которому она не соответствует. Мое понимание списка делает то, что, я думаю, вы имели в виду, то есть добавляет только одну копию каждой строки, которая не соответствует ни одному из регулярных выражений.
Ответ 2 · johannix
Я бы работал над вашим кодом до этого:
a_list = [
'HELLO',
'FOO',
'FO1BAR',
'ROOBAR',
'SHOEBAR'
]
regex_func = lambda x: not re.search(r'(FOO|RO)', x, re.IGNORECASE)
Тогда у вас есть два варианта:
Фильтр
newlist = filter(regex_func, a_list)
Список включений
newlist = [x for x in a_list if regex_func(x)]