【问题标题】:list comprehension error列表理解错误
【发布时间】:2016-04-17 21:55:49
【问题描述】:

谁能帮我纠正这个列表理解:

line_list = [line for line in file.splitlines() if item in line for item in my_list]

因为我收到以下错误

UnboundLocalError: local variable 'item' referenced before assignment

【问题讨论】:

    标签: python list python-2.7 python-3.x list-comprehension


    【解决方案1】:

    你有点乱了:

    line_list = [line for line in file.splitlines() for item in my_list if item in line]
    

    过滤器在最后。

    另请注意,如果my_list 中有多个匹配项,则上述内容可能会在一行中放置多个重复行。以下将检查是否有任何匹配项,然后只添加一次:

    line_list = [line for line in file.splitlines() if any(item in line for item in my_list)]
    

    【讨论】:

    • 是否会像 next 那样短路 any,只要迭代器的一个元素的表达式计算结果为 True?
    • 是的,any()all() 会短路。
    【解决方案2】:

    完整的循环如下所示:

    line_list = []
    for line in file.splitlines():
        for item in my_list:
            if item in line:
                line_list.append(line)
    

    放在同一行,像这样(不是真正的 Python 语法):

    line_list = []
    for line in file.splitlines(): for item in my_list: if item in line: line_list.append(line)
    

    当然,.append() 部分是所有推导共有的,所以我们把它放在开头:

    line_list = [line for line in file.splitlines() for item in my_list if item in line]
    

    如果你只是想到这样的列表推导,应该很容易弄清楚使用了什么顺序。

    当您有 else 语句时,不要让它让您感到困惑。例如:

    line_list = []
    for line in file.splitlines():
        if line == "yes":
            line_list.append("no")
        else:
            line_list.append(line)
    

    将被解释为:

    line_list = ["no" if line == "yes" else line for line in file.splitlines()]
    

    if-else 开头。为什么?你问。好吧,它本来可以这样写的:

    line_list = []
    for line in file.splitlines():
        line_list.append("no" if line == "yes" else line)
    

    你看,理解开头的部分仍然和传递给.append()的部分一样。 else 子句不是理解语法的一部分;它是该语言的一个独立特征。


    不过,@TigerhawkT3 对使用 any() 提出了一个很好的观点。

    【讨论】:

    • 关于如何解释理解的非常有趣/清晰的解释!
    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-24
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多