I'd like to get from this:
keys = [1,2,3] to this:
{1: None, 2: None, 3: None} Is there a pythonic way of doing it?
This is an ugly way to do it:
>>> keys = [1,2,3] >>> dict([(1,2)]) {1: 2} >>> dict(zip(keys, [None]*len(keys))) {1: None, 2: None, 3: None} 7 Answers
You can use fromkeys:
dict.fromkeys([1, 2, 3, 4]) This is actually a classmethod, so it works for dict-subclasses (like collections.defaultdict) as well. The optional second argument specifies the value to use for the keys (defaults to None.)
nobody cared to give a dict-comprehension solution ?
>>> keys = [1,2,3,5,6,7] >>> {key: None for key in keys} {1: None, 2: None, 3: None, 5: None, 6: None, 7: None} 6dict.fromkeys(keys, None) 4>>> keyDict = {"a","b","c","d"} >>> dict([(key, []) for key in keyDict]) Output:
{'a': [], 'c': [], 'b': [], 'd': []} 3d = {} for i in keys: d[i] = None 0In many workflows where you want to attach a default / initial value for arbitrary keys, you don't need to hash each key individually ahead of time. You can use collections.defaultdict. For example:
from collections import defaultdict d = defaultdict(lambda: None) print(d[1]) # None print(d[2]) # None print(d[3]) # None This is more efficient, it saves having to hash all your keys at instantiation. Moreover, defaultdict is a subclass of dict, so there's usually no need to convert back to a regular dictionary.
For workflows where you require controls on permissible keys, you can use dict.fromkeys as per the accepted answer:
d = dict.fromkeys([1, 2, 3, 4]) Just because it's fun how the dict constructor works nicely with zip, you can repeat the default value and zip it to the keys:
from itertools import repeat keys = [1, 2, 3] default_value = None d = dict(zip(keys, repeat(default_value))) print(d) Will give:
{1: None, 2: None, 3: None} repeat creates an infinite iterator of the element passed to it but as zip stops on the shortest iterable all works well.