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