Skip to content

Instantly share code, notes, and snippets.

@jeromerg
Created March 25, 2021 10:49
Show Gist options
  • Save jeromerg/91f73d5867c5fa04ee7dbc0c5a03d611 to your computer and use it in GitHub Desktop.
Save jeromerg/91f73d5867c5fa04ee7dbc0c5a03d611 to your computer and use it in GitHub Desktop.
def sort_recursive(node, first_keys, last_keys):
""" Sort the dictionary entries in a whole JSON object tree"""
fixed_placements = {
**{key: (0, idx) for idx, key in enumerate(first_keys)},
**{key: (2, idx) for idx, key in enumerate(last_keys)},
}
return _sort_recursive(node, lambda key: fixed_placements.get(key, (1, key)))
def _sort_recursive(node, key_fn):
if isinstance(node, list):
return [_sort_recursive(val, key_fn) for val in node]
elif isinstance(node, tuple):
return tuple([_sort_recursive(val, key_fn) for val in node])
elif isinstance(node, dict):
sorted_keys = sorted(node.keys(), key=key_fn)
return {k:_sort_recursive(node[k], key_fn) for k in sorted_keys}
else:
return node
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment