Imprima de forma legible un dict de python () ordenado por clave

Me gustaría imprimir un diccionario de Python en un archivo con PrettyPrinter (para facilitar la lectura humana), pero ordenar el diccionario por clave en el archivo de salida para mejorar aún más la legibilidad. Asi que:

mydict = {'a':1, 'b':2, 'c':3} pprint(mydict) 

actualmente imprime a

 {'b':2, 'c':3, 'a':1} 

Me gustaría imprimir el diccionario de PrettyPrint, pero imprimirlo ordenado por clave, por ejemplo.

 {'a':1, 'b':2, 'c':3} 

¿Cuál es la mejor manera de hacer esto?

En realidad, pprint parece ordenar las claves por ti bajo python2.5

 >>> from pprint import pprint >>> mydict = {'a':1, 'b':2, 'c':3} >>> pprint(mydict) {'a': 1, 'b': 2, 'c': 3} >>> mydict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5} >>> pprint(mydict) {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} >>> d = dict(zip("kjihgfedcba",range(11))) >>> pprint(d) {'a': 10, 'b': 9, 'c': 8, 'd': 7, 'e': 6, 'f': 5, 'g': 4, 'h': 3, 'i': 2, 'j': 1, 'k': 0} 

Pero no siempre bajo python 2.4

 >>> from pprint import pprint >>> mydict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5} >>> pprint(mydict) {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4} >>> d = dict(zip("kjihgfedcba",range(11))) >>> pprint(d) {'a': 10, 'b': 9, 'c': 8, 'd': 7, 'e': 6, 'f': 5, 'g': 4, 'h': 3, 'i': 2, 'j': 1, 'k': 0} >>> 

Leyendo el código fuente de pprint.py (2.5), ordena el diccionario usando

 items = object.items() items.sort() 

para multilínea o esto para una sola línea

 for k, v in sorted(object.items()): 

antes de que intente imprimir algo, así que si su diccionario se clasifica correctamente, debería imprimirse correctamente. En 2.4 falta el segundo ordenado () (no existía entonces) por lo que los objetos impresos en una sola línea no se ordenarán.

Entonces, la respuesta parece ser usar python2.5, aunque esto no explica del todo el resultado de la pregunta.

Actualización de Python3

Impresión bonita por claves ordenadas (lambda x: x [0]):

 for key, value in sorted(dict_example.items(), key=lambda x: x[0]): print("{} : {}".format(key, value)) 

Impresión bonita por valores ordenados (lambda x: x [1]):

 for key, value in sorted(dict_example.items(), key=lambda x: x[1]): print("{} : {}".format(key, value)) 

Otra alternativa:

 >>> mydict = {'a':1, 'b':2, 'c':3} >>> import json 

Luego con python2:

 >>> print json.dumps(mydict, indent=4, sort_keys=True) # python 2 { "a": 1, "b": 2, "c": 3 } 

o con python 3:

 >>> print(json.dumps(mydict, indent=4, sort_keys=True)) # python 3 { "a": 1, "b": 2, "c": 3 } 

El módulo de pprint Python en realidad ya ordena los diccionarios por clave. En las versiones anteriores a Python 2.5, la clasificación solo se activaba en los diccionarios cuya representación impresa en forma bonita abarcaba varias líneas, pero en 2.5.X y 2.6.X, todos los diccionarios están ordenados.

Sin embargo, en general, si está escribiendo estructuras de datos en un archivo y desea que sean legibles para el usuario y que se puedan escribir, es posible que desee considerar el uso de un formato alternativo como YAML o JSON. A menos que los usuarios mismos sean progtwigdores, hacer que mantengan la configuración o el estado de la aplicación volcado a través de pprint y cargado a través de eval puede ser una tarea frustrante y propensa a errores.

Escribí la siguiente función para imprimir dictados, listas y tuplas en un formato más legible:

 def printplus(obj): """ Pretty-prints the object passed in. """ # Dict if isinstance(obj, dict): for k, v in sorted(obj.items()): print u'{0}: {1}'.format(k, v) # List or tuple elif isinstance(obj, list) or isinstance(obj, tuple): for x in obj: print x # Other else: print obj 

Ejemplo de uso en iPython:

 >>> dict_example = {'c': 1, 'b': 2, 'a': 3} >>> printplus(dict_example) a: 3 b: 2 c: 1 >>> tuple_example = ((1, 2), (3, 4), (5, 6), (7, 8)) >>> printplus(tuple_example) (1, 2) (3, 4) (5, 6) (7, 8) 

Una forma fácil de imprimir los contenidos ordenados del diccionario, en Python 3:

 >>> dict_example = {'c': 1, 'b': 2, 'a': 3} >>> for key, value in sorted(dict_example.items()): ... print("{} : {}".format(key, value)) ... a : 3 b : 2 c : 1 

La expresión dict_example.items() devuelve tuplas, que luego pueden ser ordenadas por sorted() :

 >>> dict_example.items() dict_items([('c', 1), ('b', 2), ('a', 3)]) >>> sorted(dict_example.items()) [('a', 3), ('b', 2), ('c', 1)] 

A continuación se muestra un ejemplo para imprimir bastante el contenido ordenado de los valores de un diccionario de Python.

 for key, value in sorted(dict_example.items(), key=lambda d_values: d_values[1]): print("{} : {}".format(key, value)) 

Tuve el mismo problema que tú. Utilicé un bucle for con la función ordenada que pasa en el diccionario como tal:

 for item in sorted(mydict): print(item) 

Podría transformar este dictado un poco para asegurarse de que (ya que los dictados no se mantienen clasificados internamente), por ejemplo

 pprint([(key, mydict[key]) for key in sorted(mydict.keys())])