Список понятий и условий? - PullRequest
7 голосов
/ 05 мая 2009

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

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, в другой список.

например. ==>

newlist = []
for each in a_list:
    for regex in regex_list:
        if(regex(each) == None):
            newlist.append(each)

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

Ответы [ 2 ]

18 голосов
/ 05 мая 2009

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

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

РЕДАКТИРОВАТЬ : при ближайшем рассмотрении я замечаю, что ваш пример кода фактически добавляет в новый список каждую строку в a_list, которая не соответствует всем регулярным выражениям - и что более того, он добавляет каждую строку один раз для каждого регулярного выражения, которое ему не соответствует. Мое понимание списка делает то, что, я думаю, вы имели в виду, а именно добавление только одной копии каждой строки, которая не соответствует любому регулярных выражений.

0 голосов
/ 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)]

...