我刚试过像这样的列表理解
[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
?
这会产生错误:
{d[i]:0 if i==3 else d[i]:True for i in range(0,4) }
^
SyntaxError: invalid syntax
注意:我在这里使用的示例只是一个随机的,而不是我的实际代码。 我可以用另一种解决方案来做到这一点,但我现在只是想看dict理解来学习。
答案 0 :(得分:6)
您正在使用conditional expression。它只能在接受表达式的地方使用。
在字典理解中,键和值部分是单独的表达式,由:
分隔(因此:
字符不是表达的一部分)。您可以在其中每个中使用条件表达式,但不能同时使用它们。
您只需要在价值部分使用它:
{d[i]: 0 if i == 3 else True for i in range(4)}
但是,您会收到KeyError
个例外,因为d
词典没有0
,1
和2
个键。
请参阅表达式参考文档的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))