Python列表过滤和转换

Ale*_*tov 10 python filtering transformation list

我有一个库文件名列表,我需要过滤正则表达式,然后从匹配的文件中提取版本号.这是显而易见的方法:

libs = ['libIce.so.33', 'libIce.so.3.3.1', 'libIce.so.32', 'libIce.so.3.2.0']
versions = []
regex = re.compile('libIce.so\.([0-9]+\.[0-9]+\.[0-9]+)')
for l in libs:
    m = regex.match(l)
    if m:
        versions.append(m.group(1))
Run Code Online (Sandbox Code Playgroud)

这产生以下列表:

['3.3.1', '3.2.0']
Run Code Online (Sandbox Code Playgroud)

然而我觉得循环不是'Python风格',并且觉得应该可以用一些聪明的单行代替'for'循环.建议?

Mat*_*son 19

列表理解怎么样?

In [5]: versions = [m.group(1) for m in [regex.match(lib) for lib in libs] if m] 
In [6]: versions
Out[6]: ['3.3.1', '3.2.0']
Run Code Online (Sandbox Code Playgroud)


Den*_*ach 8

还有一个单行显示其他方式(我还清理了一点regexp):

regex = re.compile(r'^libIce\.so\.([0-9]+\.[0-9]+\.[0-9]+)$')
sum(map(regex.findall, libs), [])
Run Code Online (Sandbox Code Playgroud)

但请注意,您的原始版本比所有建议更具可读性.是否值得改变?


sth*_*sth 5

你可以这样做:

versions = [m.group(1) for m in [regex.match(l) for l in libs] if m]
Run Code Online (Sandbox Code Playgroud)

我觉得它不太可读,但......

也许它分两步更清晰:

matches = [regex.match(l) for l in line]
versions = [m.group(1) for m in matches if m]
Run Code Online (Sandbox Code Playgroud)