将代码转换为列表理解

时间:2017-08-01 17:06:01

标签: python

我写了一些代码来迭代一个列表,看看一行是否包含一个或多个关键字:

STRINGS_TO_MATCH = [ "Foo",
                     "Bar",
                     "Oggle" ]

for string in STRINGS_TO_MATCH
    if string in line:
        val_from_line = line.split(' ')[-1]

有没有人碰巧知道是否有办法让这个更具可读性?列表理解会更适合这里吗?

1 个答案:

答案 0 :(得分:2)

这里要记住的是 comprehensions是表达式,其目的是创建一个值 - 列表推导创建列表,dict comprehensions创建dicts,以及设置comprehensions创建集合。在这种情况下,他们不太可能提供帮助,因为您没有创建任何此类对象。

您的代码示例不完整,因为它不会执行任何具有val_from_line值的内容。我假设您要从包含line中的任何字符串的STRINGS_TO_MATCH中提取最后一个“单词”,但是很难处理这些不完整的信息,所以这个答案可能对我而言知道,完全没用。

假设我是正确的,找出line是否包含任何STRINGS_TO_MATCH的最简单方法是使用表达式

any(s in line for s in STRINGS_TO_MATCH)

这使用了一个所谓的生成器表达式,它类似于列表推导 - 解释器可以迭代它以生成一系列值 - 但它不能创建一个值列表,它只是创建它们作为客户端代码(在这种情况下,any内置函数)请求它们。所以我可能会将您的代码重写为

if any(s in line for s in STRINGS_TO_MATCH):
    val_from_line = line.split(' ')[-1]

在此之后我会让你决定你真正想做什么,警告说明这段代码执行后val_from_line可能存在也可能不存在(取决于条件是否为真),这绝不是一个完全舒适的情况。