Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Dictionary Comprehension

Is it possible to create a dictionary comprehension in Python (for the keys)?

Without list comprehensions, you can use something like this:

l = [] for n in range(1, 11):     l.append(n) 

We can shorten this to a list comprehension: l = [n for n in range(1, 11)].

However, say I want to set a dictionary's keys to the same value. I can do:

d = {} for n in range(1, 11):      d[n] = True # same value for each 

I've tried this:

d = {} d[i for i in range(1, 11)] = True 

However, I get a SyntaxError on the for.

In addition (I don't need this part, but just wondering), can you set a dictionary's keys to a bunch of different values, like this:

d = {} for n in range(1, 11):     d[n] = n 

Is this possible with a dictionary comprehension?

d = {} d[i for i in range(1, 11)] = [x for x in range(1, 11)] 

This also raises a SyntaxError on the for.

like image 949
Rushy Panchal Avatar asked Jan 24 '13 17:01

Rushy Panchal


People also ask

Is there dictionary comprehension in Python?

Like List Comprehension, Python allows dictionary comprehensions. We can create dictionaries using simple expressions.

What is dictionary comprehension in Python with example?

Example 1: Dictionary Comprehension The output of both programs will be the same. In both programs, we have created a dictionary square_dict with number-square key/value pair. However, using dictionary comprehension allowed us to create a dictionary in a single line.

What is the difference between list comprehension and dictionary comprehension in Python?

Its syntax is the same as List Comprehension. It returns a generator object. A dict comprehension, in contrast, to list and set comprehensions, needs two expressions separated with a colon. The expression can also be tuple in List comprehension and Set comprehension.


Video Answer


2 Answers

There are dictionary comprehensions in Python 2.7+, but they don't work quite the way you're trying. Like a list comprehension, they create a new dictionary; you can't use them to add keys to an existing dictionary. Also, you have to specify the keys and values, although of course you can specify a dummy value if you like.

>>> d = {n: n**2 for n in range(5)} >>> print d {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} 

If you want to set them all to True:

>>> d = {n: True for n in range(5)} >>> print d {0: True, 1: True, 2: True, 3: True, 4: True} 

What you seem to be asking for is a way to set multiple keys at once on an existing dictionary. There's no direct shortcut for that. You can either loop like you already showed, or you could use a dictionary comprehension to create a new dict with the new values, and then do oldDict.update(newDict) to merge the new values into the old dict.

like image 113
BrenBarn Avatar answered Sep 18 '22 12:09

BrenBarn


You can use the dict.fromkeys class method ...

>>> dict.fromkeys(range(5), True) {0: True, 1: True, 2: True, 3: True, 4: True} 

This is the fastest way to create a dictionary where all the keys map to the same value.

But do not use this with mutable objects:

d = dict.fromkeys(range(5), []) # {0: [], 1: [], 2: [], 3: [], 4: []} d[1].append(2) # {0: [2], 1: [2], 2: [2], 3: [2], 4: [2]} !!! 

If you don't actually need to initialize all the keys, a defaultdict might be useful as well:

from collections import defaultdict d = defaultdict(True) 

To answer the second part, a dict-comprehension is just what you need:

{k: k for k in range(10)} 

You probably shouldn't do this but you could also create a subclass of dict which works somewhat like a defaultdict if you override __missing__:

>>> class KeyDict(dict): ...    def __missing__(self, key): ...       #self[key] = key  # Maybe add this also? ...       return key ...  >>> d = KeyDict() >>> d[1] 1 >>> d[2] 2 >>> d[3] 3 >>> print(d) {} 
like image 42
mgilson Avatar answered Sep 20 '22 12:09

mgilson