我正在练习一些python语法练习,我决定根据类似设计的列表理解来编写字典理解。但是虽然后者没问题,但前者导致语法错误。
这是我的列表理解..
>>> l = [z**z if z%2 else z for z in range(5)]
[0, 1, 2, 27, 4]
这是我的字典理解..
>>> d = {z:z**z if z%2 else z:z for z in range(5)}
^
SyntaxError: invalid syntax
有没有办法编写一个与我的列表理解类似的字典理解?
答案 0 :(得分:1)
你可以写
In [16]: d = {z:z**z if z%2 else z for z in range(5)}
In [17]: d
Out[17]: {0: 0, 1: 1, 2: 2, 3: 27, 4: 4}
如果提供括号,则更容易阅读:
In [18]: d = {z:(z**z if z%2 else z) for z in range(5)}
In [19]: d
Out[19]: {0: 0, 1: 1, 2: 2, 3: 27, 4: 4}
对于(键,值)对,所附部分的值为Python ternary expression,不是。
@timgeb但是如果他也想在其他地方更改密钥怎么办?
(我们假设我们想要z*10
。)在这种情况下,您可以编写类似
In [24]: d = {(z*10 if z%2 else z):(z**z if z%2 else z) for z in range(5)}
In [25]: d
Out[25]: {0: 0, 10: 1, 4: 4, 2: 2, 30: 27}
但这是低效的,因为z%2
计算了两次。
最好利用dict
构造函数采用可迭代的两元素迭代的事实:
In [26]: dict((z*10, z**z) if z%2 else (z, z) for z in range(5))
Out[26]: {0: 0, 10: 1, 4: 4, 2: 2, 30: 27}
答案 1 :(得分:0)
尝试:
{z:z**z if z%2 else z for z in range(5)}
输出:
{0: 0, 1: 1, 2: 2, 3: 27, 4: 4}
[Finished in 0.2s]
答案 2 :(得分:0)
d = {z:z**z if z%2 else z for z in range(5)}
print(d)
提供输出:
{0: 0, 1: 1, 2: 2, 3: 27, 4: 4}