Python 3中理解字典

Dictionary Comprehension in Python 3

我在Python2.7Python 3+中发现了关于dict理解的以下堆栈溢出帖子:用python创建一个列表理解的字典,声明我可以应用这样的字典理解:

1
d = {key: value for (key, value) in sequence}

我在python 3中尝试过。然而,它引发了一个例外。

1
2
3
d = {'a':1, 'b':2, 'c':3, 'd':4}
{key : value for (key, value) in d}
{key : value for key, value in d}

两个版本都提出了一个ValueError,说ValueError: need more than 1 value to unpack

在python3中,最简单/最直接的理解词典的方法是什么?


循环查找字典只会生成键。使用d.items()循环键和值:

1
{key: value for key, value in d.items()}

您看到的ValueError异常不是听写理解问题,也不局限于python3;您在python2或常规for循环中会看到相同的问题:

1
2
3
4
5
6
7
>>> d = {'a':1, 'b':2, 'c':3, 'd':4}
>>> for key, value in d:
...     print key, value
...
Traceback (most recent call last):
  File"<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack

因为每次迭代都只生成一个项。

如果不进行转换,{k: v for k, v in d.items()}只是一个冗长而昂贵的d.copy();只有在对键或值做得稍微多一些、使用条件或更复杂的循环构造时,才使用dict理解。


上面说得很好-如果你这样做,你可以在python3中放置物品:

{key: d[key] for key in d}

1
2
3
4
d = {'a':1, 'b':2, 'c':3, 'd':4}
z = {x: d[x] for x in d}
z
>>>{'a': 1, 'b': 2, 'c': 3, 'd': 4}

这也提供了使用条件的能力

1
2
3
y = {x: d[x] for x in d if d[x] > 1}
y
>>>{'b': 2, 'c': 3, 'd': 4}

享受!


字典理解是指通过某种逻辑在字典中生成项:

1
2
3
4
5
6
7
x = {p: p*p for p in range(10)}

print(x)

y = {q: q*3 for q in range(5,15) if q%2!=0}

print(y)