【问题标题】:Why is this list comprehension giving me a syntax error? [duplicate]为什么这个列表理解给我一个语法错误? [复制]
【发布时间】:2014-10-08 18:55:55
【问题描述】:

我有以下列表理解。

return [tower for tower in state if tower != space else []]

但是当我运行它时,python 吐出这个错误:

return [tower for tower in state if tower != space else []]  
                                                      ^
    SyntaxError: invalid syntax

如果我删除 else 语句,它运行良好。我是不是把 else 语句写错了?

【问题讨论】:

    标签: python if-statement list-comprehension


    【解决方案1】:

    列表推导式支持if,但不支持else,因为if 部分过滤 元素,您要么包含一个元素,要么不包含它,这是一个布尔选择。

    如果您想使用条件表达式来构建 for 循环的 iterable 部分,请使用括号:

    return [tower for tower in (state if tower != space else [])]  
    

    但我怀疑您想更改 元素表达式 中表达式的值;这不是过滤,您只是为某些项目生成不同的值。使用conditional expression 生成您的值:

    return [tower if tower != space else [] for tower in state]  
    

    或者如果你真的想过滤,只需省略else

    return [tower for tower in state if tower != space]  
    

    在构建列表推导式时,请记住,您需要将表达式从左到右读取为 嵌套,最终表达式在左侧产生结果:

    [element_producing_expression for name in iterable if filter_expression]
    

    在道德上等同于:

    for name in iterable:
        if filter_expression:
            element_producing_expression
    

    您可以根据用例的需要使用尽可能多的嵌套循环和if 过滤器。

    我上面描述的三个选项与以下相同:

    # conditional expression producing the iterable
    for tower in (state if tower != space else []):
        tower 
    
    # conditional expression in the element expression
    for tower in state:
        tower if tower != space else [] 
    
    # filtering expression with no else
    for tower in state:
        if tower != space:
            tower
    

    【讨论】:

      【解决方案2】:

      您将 else 放在了推导式的 for 子句中,但您需要将整个 if/else 表达式放在目标表达式中:

      [tower if tower != space else [] for tower in state]
      

      当您使用for tower in state if <condition> 时,您是说如果state 中的项目不满足条件,您甚至不想使用它们。在这种情况下,您不能使用else,因为您所能做的就是处理每个项目(包括列表理解结果中的某些内容)。

      另一方面,X if Y else Z 是一个普通表达式,可以用作列表推导的目标表达式。这意味着源迭代中的每个元素都会在结果中生成一个元素,但 if/else 决定了该结果项将是什么。

      【讨论】:

        【解决方案3】:

        这个怎么样:

        [tower if tower != space else [] for tower in state]
        

        【讨论】:

          【解决方案4】:

          这是因为 python 在列表解析过滤器中不支持if-else,只支持if 子句。

          但是,您可以通过使用条件表达式来获得您想要的结果

           [tower if tower != space else [] for tower in state]
          

          【讨论】:

            猜你喜欢
            • 2011-01-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-19
            • 2011-05-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多