Как использовать повторно сопоставляемые объекты в понимании списка

У меня есть функция для выделения комков из списка строк и возврата их в виде другого списка:

def filterPick(lines,regex): result = [] for l in lines: match = re.search(regex,l) if match: result += [match.group(1)] return result 

Есть ли способ переформулировать это как понимание списка? Очевидно, это довольно ясно, как есть; просто любопытно.


Спасибо тем, кто внес свой вклад, особенно для @Alex. Вот конденсированная версия того, что у меня получилось; метод совпадения регулярных выражений передается filterPick как «предварительно поднятый» параметр:

 import re def filterPick(list,filter): return [ ( l, m.group(1) ) for l in list for m in (filter(l),) if m] theList = ["foo", "bar", "baz", "qurx", "bother"] searchRegex = re.compile('(a|r$)').search x = filterPick(theList,searchRegex) >> [('bar', 'a'), ('baz', 'a'), ('bother', 'r')] 

4 Solutions collect form web for “Как использовать повторно сопоставляемые объекты в понимании списка”

 [m.group(1) for l in lines for m in [regex.search(l)] if m] 

«Трюк» – это for m in [regex.search(l)] – вот как вы «назначаете» значение, которое вам нужно использовать более одного раза, в понимании списка – добавьте только такое положение, где объект «итерации» по одному элементу списка, содержащему одно значение, которое вы хотите «назначить» ему. Некоторые считают это стилистически сомнительным, но иногда я считаю это практичным.

 return [m.group(1) for m in (re.search(regex, l) for l in lines) if m] 

Его можно немного сократить

 def filterPick(lines, regex): matches = map(re.compile(regex).match, lines) return [m.group(1) for m in matches if m] 

Вы могли бы поместить все это в одну строку, но это означало бы, что вам придется сопоставлять каждую строку дважды, что было бы немного менее эффективным.

 >>> "a" in "a visit to the dentist" True >>> "a" not in "a visit to the dentist" False 

Это также работает с поисковым запросом, который вы просматриваете в списке

`P = 'a', 'b', 'c'

'b' в P` возвращает true

Python - лучший язык программирования в мире.