Python 3中的字典推导式

42

我在stackoverflow上找到了一个关于在Python2.7和Python3+中使用字典理解的帖子:用列表推导式创建Python字典。该帖子指出,我可以像这样应用字典理解:

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

我在 Python 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中,最简单/最直接的方法是什么,可以使用字典推导式?


3
这个字典推导式期望接收一组键值对的序列作为输入,而你却将一个字典传递进去了,而字典并不是一组键值对的序列。 - user2357112
我知道这是一个老问题,但我想补充一下,为了避免错误,d 应该是 (('a', 1), ('b', 2), ('c', 3'), ('d', 4)) - Artemis
你可以参考这个Python字典推导式的例子,了解如何使用字典推导式来创建新的字典。 - undefined
3个回答

71

遍历字典时只会生成。使用d.items()来同时遍历键和值:

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

你看到的ValueError异常并不是字典推导式的问题,也不仅限于Python 3;你在Python 2中或使用普通的for循环中也会遇到相同的问题:

>>> 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()。仅在对键或值进行一些操作时使用字典推导,或使用条件或更复杂的循环结构。


11

以上说得很好 - 如果你想在Python3中删除项目,可以按照这种方式操作:

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

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}

而这也为使用条件提供了能力

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

愉快地享受吧!


1
字典推导式指的是通过某种逻辑生成字典中的项。
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接