python - 这个Python代码可以用列表理解来表达吗?

标签 python list list-comprehension

我发现以下内容完全可读,但想知道它们是否是一种更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/

相关文章:

python - 如何提高读取文件程序的运行时性能

python - 按内部数组的特定元素分组

python - 添加数字,然后添加元组以作为元组列出,但它会删除外部元组

python - 这个 Python 列表推导式是按什么顺序执行的?

list - 元组列表中的问题

python - 五个骰子的优雅迭代

python - Unicode 和 lxml 对象化数据

python - 列表未正确填写

python - 优雅地扩展几个列表

python - 从两个不同长度的列表( [2 * n] 和 [2 * m] )到 [ 3 * len(unique(n[0],m[0])) ] 的单个列表的列表理解