python词典理解方法中的单行if else

时间:2017-09-16 13:46:30

标签: python list-comprehension dictionary-comprehension

我刚试过像这样的列表理解

[i if i==0 else i+100for i in range(0,3)]

并且它有效,但当我尝试类似的字典理解时,它会抛出一个错误:

d={3:3}
{d[i]:0 if i==3 else d[i]:True for i in range(0,4) }

可能是什么原因?如何使用if else

使用dict理解

这会产生错误:

    {d[i]:0 if i==3 else d[i]:True for i in range(0,4) }
                             ^
SyntaxError: invalid syntax

注意:我在这里使用的示例只是一个随机的,而不是我的实际代码。 我可以用另一种解决方案来做到这一点,但我现在只是想看dict理解来学习。

2 个答案:

答案 0 :(得分:6)

您正在使用conditional expression。它只能在接受表达式的地方使用。

在字典理解中,键和值部分是单独的表达式,由:分隔(因此:字符不是表达的一部分)。您可以在其中每个中使用条件表达式,但不能同时使用它们。

您只需要在价值部分使用它:

{d[i]: 0 if i == 3 else True for i in range(4)}

但是,您会收到KeyError个例外,因为d词典没有012个键。

请参阅表达式参考文档的Dictionary displays section

dict_display       ::=  “{” [key_datum_list | dict_comprehension] “}”
[...]
dict_comprehension ::=  expression “:” expression comp_for
     

[...]

     

与列表和集合理解相比,字典理解需要两个用冒号分隔的表达式,后跟通常的“for”和“if”子句。

答案 1 :(得分:3)

使用if-else 问题 dict理解的另一种解决方案:

dict((x, x ** 2) if x > 0 else (x, -x ** 2) for x in range(-4, 5))