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

sya*_*yam 1 python list-comprehension dictionary-comprehension

我刚试过这样的列表理解

[i if i==0 else i+100for i in range(0,3)]
Run Code Online (Sandbox Code Playgroud)

它工作,但当我尝试类似的字典理解时,它会抛出一个错误:

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

可能是什么原因?我怎样才能使用dict理解if else

这会产生错误:

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

注意:我在这里使用的示例只是一个随机的,而不是我的实际代码.我可以用替代解决方案来做到这一点,但我现在只是在研究dict理解.

Mar*_*ers 7

您正在使用条件表达式.它只能在接受表达式的地方使用.

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

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

{d[i]: 0 if i == 3 else True for i in range(4)}
Run Code Online (Sandbox Code Playgroud)

然而,你会得到一个KeyError异常,因为d字典里没有0,12钥匙.

请参阅表达式参考文档的Dictionary显示部分:

dict_display       ::=  “{” [key_datum_list | dict_comprehension] “}”
[...]
dict_comprehension ::=  expression “:” expression comp_for
Run Code Online (Sandbox Code Playgroud)

[...]

与list和set comprehensions相反,dict理解需要两个用冒号分隔的表达式,后跟通常的"for"和"if"子句.


Ily*_*rov 5

字典理解if-else问题的另一种解决方案:

dict((x, x ** 2) if x > 0 else (x, -x ** 2) for x in range(-4, 5))
Run Code Online (Sandbox Code Playgroud)