Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dictionary Comprehension in Python 3

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?

like image 286
Jon Avatar asked Dec 10 '13 08:12

Jon


People also ask

What is a dictionary comprehension in Python?

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.

What is dictionary and list comprehension in Python?

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.

What is a comprehension in Python 3?

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.


2 Answers

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.

like image 134
Martijn Pieters Avatar answered Sep 29 '22 06:09

Martijn Pieters


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!

like image 39
RandallShanePhD Avatar answered Sep 29 '22 06:09

RandallShanePhD