列出字典理解

list to dictionary comprehensions

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

有没有一种方法可以编写在设计上与我的列表理解相似的字典理解?

尝试:

{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]
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}

你可以写

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 but what if he also wants to change the key too in the else?

(假设我们想要 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}