Since python 3.6/3.7, dictionaries are ordered by insertion order, so it is possible to sort a dict. If you are using an older version of python, then it is not possible: dicts are not ordered.
Here I give a function to sort a dict by keys, and use it with one level of nesting.
d = {'even': {'1': 'odd', '0': 'even'}, 'odd': {'1': 'even', '0': 'odd'}}
def sorted_simple_dict(d):
return {k: v for k, v in sorted(d.items())}
def sorted_once_nested_dict(d):
return {k: sorted_simple_dict(v) for k, v in sorted(d.items())}
sorted_d = sorted_once_nested_dict(d)
# {'even': {'0': 'even', '1': 'odd'}, 'odd': {'0': 'odd', '1': 'even'}}
If you want to sort arbitrarily deep nested dicts, you can use recursion and isinstance( , dict)
:
d = {'even': {'even': {'even': {'1': 'odd', '0': 'even'}, 'odd': {'1': 'even', '0': 'odd'}}, '1': 'odd', '0': 'even'}, 'odd': {'1': 'even', '0': 'odd'}}
def sorted_nested_dict(d):
if isinstance(d, dict):
return {k: sorted_nested_dict(v) for k, v in sorted(d.items())}
else:
return d
sorted_d = sorted_nested_dict(d)
# {'even': {'0': 'even', '1': 'odd', 'even': {'even': {'0': 'even', '1': 'odd'}, 'odd': {'0': 'odd', '1': 'even'}}}, 'odd': {'0': 'odd', '1': 'even'}}
See also: