I found the following stack overflow post about dict comprehensions in Python2.7
and Python 3+
: Create a dictionary with list comprehension in Python stating that I can apply dictionary comprehensions like this:
d = {key: value for (key, value) in sequence}
I tried it in Python 3. However, it raises an exception.
d = {'a':1, 'b':2, 'c':3, 'd':4} {key : value for (key, value) in d} {key : value for key, value in d}
Both versions raise a ValueError
saying that ValueError: need more than 1 value to unpack
.
What is the easiest / the most direct way to make a dictionary comprehension in Python3?
Dictionary comprehension is a method for transforming one dictionary into another dictionary. During this transformation, items within the original dictionary can be conditionally included in the new dictionary and each item can be transformed as needed.
List comprehensions and dictionary comprehensions are a powerful substitute to for-loops and also lambda functions. Not only do list and dictionary comprehensions make code more concise and easier to read, they are also faster than traditional for-loops.
We can create new sequences using a given python sequence. This is called comprehension. It basically a way of writing a concise code block to generate a sequence which can be a list, dictionary, set or a generator by using another sequence.
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With