Python – Declaring a multi dimensional dictionary in python

dictionarypython

I need to make a two dimensional dictionary in python. e.g. new_dic[1][2] = 5

When I make new_dic = {}, and try to insert values, I get a KeyError:

new_dic[1][2] = 5
KeyError: 1

How to do this?

Best Answer

A multi-dimensional dictionary is simply a dictionary where the values are themselves also dictionaries, creating a nested structure:

new_dic = {}
new_dic[1] = {}
new_dic[1][2] = 5

You'd have to detect that you already created new_dic[1] each time, though, to not accidentally wipe that nested object for additional keys under new_dic[1].

You can simplify creating nested dictionaries using various techniques; using dict.setdefault() for example:

new_dic.setdefault(1, {})[2] = 5

dict.setdefault() will only set a key to a default value if the key is still missing, saving you from having to test this each time.

Simpler still is using the collections.defaultdict() type to create nested dictionaries automatically:

from collections import defaultdict

new_dic = defaultdict(dict)
new_dic[1][2] = 5

defaultdict is just a subclass of the standard dict type here; every time you try and access a key that doesn't yet exist in the mapping, a factory function is called to create a new value. Here that's the dict() callable, which produces an empty dictionary when called.

Demo:

>>> new_dic_plain = {}
>>> new_dic_plain[1] = {}
>>> new_dic_plain[1][2] = 5
>>> new_dic_plain
{1: {2: 5}}
>>> new_dic_setdefault = {}
>>> new_dic_setdefault.setdefault(1, {})[2] = 5
>>> new_dic_setdefault
{1: {2: 5}}
>>> from collections import defaultdict
>>> new_dic_defaultdict = defaultdict(dict)
>>> new_dic_defaultdict[1][2] = 5
>>> new_dic_defaultdict
defaultdict(<type 'dict'>, {1: {2: 5}})