Перечислите Понимания и Условия?

Я пытаюсь понять, смогу ли я улучшить этот код, используя генераторы списков.
Допустим, у меня есть следующие списки:

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)

Как я могу сделать это, используя понимание списка? Это вообще возможно?


person UberJumper    schedule 05.05.2009    source источник
comment
-1: лямбды. Просто используйте само регулярное выражение, не тратьте время на то, чтобы оборачивать совершенно хорошее регулярное выражение в функцию.   -  person S.Lott    schedule 05.05.2009


Ответы (2)


Конечно, я думаю, что это должно сделать это

newlist = [s for s in a_list if not any(r(s) for r in regex_list)]

EDIT: при ближайшем рассмотрении я заметил, что ваш пример кода фактически добавляет в новый список каждую строку в a_list, которая не соответствует всем регулярным выражениям - и более того, это добавляет каждую строку один раз для каждого регулярного выражения, которому она не соответствует. Мое понимание списка делает то, что, я думаю, вы имели в виду, то есть добавляет только одну копию каждой строки, которая не соответствует ни одному из регулярных выражений.

person David Z    schedule 05.05.2009
comment
Не то же поведение, что и код, который он дал, поскольку каждый никогда не будет добавляться более одного раза, как в примере. Однако я считаю, что именно этого он на самом деле и хотел добиться. - person bayer; 05.05.2009
comment
Еще один вопрос, если бы я, скажем, заменил a_list функцией, которая возвращает список. Будет ли это вызвано только один раз? Или он будет вызываться на каждой итерации? например def returnalist(): return ['klsdfj', 'kldffjsdkl', 'hello', 'somethinghats'] и сделал: newlist = [s для s в returnalist(), если нет (r(s) для r в regex_list)] Возвращенца будут вызывать постоянно? - person UberJumper; 05.05.2009
comment
В этом случае его следует вызывать только один раз. Хотя всегда можно попробовать и посмотреть ;-) - person David Z; 06.05.2009
comment
Дэвид, спасибо, что показал мне потенциал любого. Я не использовал его раньше. - person praavDa; 06.05.2009

Я бы работал над вашим кодом до этого:

a_list = [
          'HELLO',
          'FOO',
          'FO1BAR',
          'ROOBAR',
          'SHOEBAR'
          ]
regex_func = lambda x: not re.search(r'(FOO|RO)', x, re.IGNORECASE)    

Тогда у вас есть два варианта:

  1. Фильтр

    newlist = filter(regex_func, a_list)

  2. Список включений

    newlist = [x for x in a_list if regex_func(x)]

person johannix    schedule 05.05.2009