How to initialize a dict with keys from a list and empty value in Python?

DictionaryPython

Dictionary Problem Overview


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}

Dictionary Solutions


Solution 1 - Dictionary

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.)

Solution 2 - Dictionary

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}

Solution 3 - Dictionary

dict.fromkeys(keys, None)

Solution 4 - Dictionary

>>> keyDict = {"a","b","c","d"}

>>> dict([(key, []) for key in keyDict])

Output:

{'a': [], 'c': [], 'b': [], 'd': []}

Solution 5 - Dictionary

d = {}
for i in keys:
    d[i] = None

Solution 6 - Dictionary

In 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])

Solution 7 - Dictionary

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJuanjo ContiView Question on Stackoverflow
Solution 1 - DictionaryThomas WoutersView Answer on Stackoverflow
Solution 2 - DictionaryAdrien PlissonView Answer on Stackoverflow
Solution 3 - DictionaryDominic CooneyView Answer on Stackoverflow
Solution 4 - DictionaryMayur KoshtiView Answer on Stackoverflow
Solution 5 - DictionaryinspectorG4dgetView Answer on Stackoverflow
Solution 6 - DictionaryjppView Answer on Stackoverflow
Solution 7 - DictionaryTomerikooView Answer on Stackoverflow