Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: UberJumperОтветов: 2

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

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: лямбды. Просто используйте само регулярное выражение, не тратьте время на то, чтобы оборачивать совершенно хорошее регулярное выражение в функцию. S.Lott 05.05.2009

pythonlistlist-comprehension

Ответы

Ответ 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)

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

  1. Фильтр

    newlist = filter(regex_func, a_list)

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы