我有一个函数从字符串列表挑选出肿块,并返回它们作为另一个列表使用重新匹配对象:如何在列表理解
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')]
亚历克斯,我喜欢那样;感谢和+1。我有一些相当繁重的工作来处理这段代码 - 我是否应该担心设置和拆除“虚拟迭代器”的额外开销?顺便说一句,我赞成“稍后优化”的原则。 – 2010-03-13 00:12:57
@Brent,对于搜索调用,“虚迭代器”应该可以忽略不计;一个较小的优化是使用'(regex.search(l),'''代替'[regex.search(l)]'(我发现它更易读,但速度更慢 - 我认为你不可能是因为你实际上正在调用模块的're.search'函数,而不是re对象的方法。将'regex.search'作为listcomp之外的绑定方法拉动是另一个次要但有用的优化,顺便提一下, – 2010-03-13 01:15:07
as当我看到你的答案时,我意识到使用re.search并不是最好的方法,你能否澄清一下你如何“将regex.search作为listcomp之外的绑定方法”?我真的很感激你对listcomp和Python noob的耐心等待 – 2010-03-13 10:08:31