1

if I have a dictionary like this

{'even': {'1': 'odd', '0': 'even'}, 'odd': {'1': 'even', '0': 'odd'}}"

I want to sort this dictionary and make it look like this

{'even': {'0': 'even', '1': 'odd'}, 'odd': {'0': 'odd', '1': 'even'}}"

How could this be done?

Alex Hu
  • 65
  • 6

1 Answers1

4

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:

Stef
  • 13,242
  • 2
  • 17
  • 28