列出字典理解
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}
我正在练习一些 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}