我发现以下内容完全可读,但想知道它们是否是一种更Python式的方式来完成它(可能是列表理解)?
import re
cgi_keys = [ '_None___total', '_George___total', 'Greg__total', '_Geoff___total', '_Gillian_total' ]
pattern = re.compile(r"_(.+)___(.+)")
totals = []
for key in cgi_keys:
m = pattern.match(key)
if m:
totals.append(m.groups())
totals
将显示:
[('None', 'total'), ('George', 'total'), ('Geoff', 'total')]
但我希望我能找到一种方法来使用如下构造来获得上述内容:
[key for key in cgi_keys if pattern.match(key)]
以不太有用的形式显示字符串:
['_None___total', '_George___total', '_Geoff___total']
这是否值得尝试将过滤后的字符串分解为元组,或将列表作为列表理解?
最佳答案
实际上你可以使用:
totals = (pattern.match(key) for key in cgi_keys)
totals = [match.groups() for match in totals if match]
它更短但仍然高效,因为第一个效果是一个生成器,其值直到第二个语句才会被评估。
此外,您可以使用:
totals = [match.groups for match in filter(None, map(pattern.match, cgi_keys))]
由于 map()
返回一个生成器。你必须使用 imap
改为Python 2。 ifilter
也是如此。
请注意,如果 cgi_keys
非常小,您也可以在 Python 2 中使用 map
,因为迭代两次完成的额外工作可能不会被注意到。
关于python - 这个Python代码可以用列表理解来表达吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32303298/