ordereddict python sorting recursion ordereddictionary

python - Ordenando un OrderedDict anidado por clave, recursivamente



modulo collections python (2)

Say orig es un OrderedDict que contiene cadenas normales: pares de valores de clave de cadena, pero a veces el valor podría ser otro OrderedDict anidado.

Quiero ordenar orig por clave, alfabéticamente (ascendente), y hacerlo recursivamente .

Reglas:

  • Suponer que las cadenas de teclas son impredecibles
  • Supongamos que la anidación puede tener lugar infinitamente, por ejemplo, el nivel 1-50 tiene todas las cadenas, OrderedDicts, etc. como valores.

Necesita ayuda con el algoritmo sorted :

import string from random import choice orig = OrderedDict(( (''a'', choice(string.digits)), (''b'', choice(string.digits)), (''c'', choice(string.digits)), (''special'', OrderedDict(( (''a'', choice(string.digits)), (''b'', choice(string.digits)), (''c'', choice(string.digits)), ))) )) sorted_copy = OrderedDict(sorted(orig.iteritems(), ...)) self.assertEqual(orig, sorted_copy)


Muy similar a la solución de @ acushner, pero basada en clases:

from collections import OrderedDict class SortedDict(OrderedDict): def __init__(self, **kwargs): super(SortedDict, self).__init__() for key, value in sorted(kwargs.items()): if isinstance(value, dict): self[key] = SortedDict(**value) else: self[key] = value

Uso:

sorted_dict = SortedDict(**unsorted_dict)


algo como:

def sortOD(od): res = OrderedDict() for k, v in sorted(od.items()): if isinstance(v, dict): res[k] = sortOD(v) else: res[k] = v return res