I found the following stack overflow post about dict comprehensions in Python2.7
and Python 3+
: Create a dictionary with list comprehension in Pyth
Dictionary comprehension means generating items in the dictionary by some logic:
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)
Looping over a dictionary only yields the keys. Use d.items()
to loop over both keys and values:
{key: value for key, value in d.items()}
The ValueError
exception you see is not a dict comprehension problem, nor is it limited to Python 3; you'd see the same problem in Python 2 or with a regular for
loop:
>>> 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
because each iteration there is only one item being yielded.
Without a transformation, {k: v for k, v in d.items()}
is just a verbose and costly d.copy()
; use a dict comprehension only when you do a little more with the keys or values, or use conditions or a more complex loop construct.
Well said above - you can drop items in Python3 if you do it this way:
{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}
and this provides for the ability to use conditions as well
y = {x: d[x] for x in d if d[x] > 1}
y
>>>{'b': 2, 'c': 3, 'd': 4}
Enjoy!