列表到词典理解

时间:2018-04-15 16:48:37

标签: python dictionary-comprehension

我正在练习一些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

有没有办法编写一个与我的列表理解类似的字典理解?

3 个答案:

答案 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}