Me gusta el módulo pprint en Python. Lo uso mucho para probar y depurar. Con frecuencia uso la opción de ancho para asegurarme de que la salida se ajuste bien dentro de la ventana de mi terminal.
Ha funcionado bien hasta que agregaron el nuevo tipo de diccionario ordenado en Python 2.7 (otra característica interesante que realmente me gusta). Si trato de imprimir con estilo un diccionario ordenado, no se ve bien. En lugar de tener cada par clave-valor en su propia línea, todo aparece en una línea larga, que se ajusta muchas veces y es difícil de leer.
¿Alguien aquí tiene una forma de hacer que se imprima bien, como los viejos diccionarios desordenados? Probablemente podría resolver algo, posiblemente usando el método PrettyPrinter.format, si dedico suficiente tiempo, pero me pregunto si alguien aquí ya conoce una solución.
ACTUALIZACIÓN: Presenté un informe de error para esto. Puede verlo en http://bugs.python.org/issue10592 .
fuente

Respuestas:
Como solución temporal, puede intentar realizar un volcado en formato JSON. Pierde algún tipo de información, pero se ve bien y mantiene el orden.
fuente
pprint.pprint(dict(data))?pprint.pprint(dict(data))funciona bien si no le importa el orden de las teclas. Personalmente, desearía que el__repr__forOrderedDictprodujera un resultado como este pero conservara el orden de las claves.Lo siguiente funcionará si el orden de su OrderedDict es alfa, ya que pprint clasificará un dictado antes de imprimirlo.
fuente
dictdebería evitar el problema de que todo se coloque en una línea.Aquí hay otra respuesta que funciona anulando y usando la
pprint()función de stock internamente. A diferencia del anterior , se manejaráOrderedDictdentro de otro contenedor como alisty también debería poder manejar cualquier argumento de palabra clave opcional dado; sin embargo, no tiene el mismo grado de control sobre la salida que el otro.Opera redirigiendo la salida de la función de stock a un búfer temporal y luego envuelve la palabra antes de enviarla al flujo de salida. Si bien el resultado final producido no es excepcionalmente bonito, es decente y puede ser "lo suficientemente bueno" para usarlo como solución.
Actualización 2.0
Simplificado mediante el uso de un
textwrapmódulo de biblioteca estándar y modificado para funcionar en Python 2 y 3.Salida de muestra:
»
{'john': 1, 'mary': 3, 'paul': 2}»
OrderedDict([('john', 1), ('paul', 2),('mary', 3)])»
[OrderedDict([('john', 1), ('paul', 2),('mary', 3)]), OrderedDict([('moe', 1),('curly', 2), ('larry', 3)]),OrderedDict([('weapons', 1), ('mass',2), ('destruction', 3)])]fuente
Para imprimir un dictado ordenado, p. Ej.
hago
Cuyos rendimientos
o
cuyos rendimientos
fuente
Aquí hay una forma que piratea la implementación de
pprint.pprintordena las claves antes de imprimir, por lo que para preservar el orden, solo tenemos que hacer que las claves se ordenen de la manera que queramos.Tenga en cuenta que esto afecta la
items()función. Por lo tanto, es posible que desee conservar y restaurar las funciones anuladas después de realizar el pprint.fuente
Aquí está mi enfoque para imprimir un OrderedDict
Si desea imprimir un diccionario bonito con claves en orden ordenado
fuente
python3. Por favor verifiqueEsto es bastante burdo, pero solo necesitaba una forma de visualizar una estructura de datos formada por cualquier Mapeo e iteración arbitrarios y esto es lo que se me ocurrió antes de rendirme. Es recursivo, por lo que caerá bien a través de estructuras y listas anidadas. Usé las clases base abstractas Mapping e Iterable de colecciones para manejar casi cualquier cosa.
Apuntaba a una salida casi similar a yaml con un código de Python conciso, pero no lo logré.
y algunos datos de prueba usando OrderedDict y listas de OrderedDicts ... (sheesh Python necesita los literales OrderedDict tan mal ...)
produce el siguiente resultado:
Tuve algunas ideas sobre el uso de str.format () para una mejor alineación, pero no tenía ganas de profundizar en ello. Debería especificar dinámicamente los anchos de campo según el tipo de alineación que desee, lo que se volvería complicado o engorroso.
De todos modos, esto me muestra mis datos de una manera jerárquica legible, ¡así que eso funciona para mí!
fuente
Ahí tienes ^^
o
fuente
pprint_od()función no está disponible - losfor key, item in odresultados de la instrucción en unaValueError: too many values to unpacky la única salida de sangría es la final" }"y elkey, itemde laprintnecesidad de ser comunicado entre paréntesis. Ahí tienes ^^He probado este truco profano basado en parche de mono en python3.5 y funciona:
Haces que
pprintutilice el resumen basado dict habitual y clasificación también desactivar durante la duración de la llamada de modo que no hay ninguna tecla en realidad clasifican para la impresión.fuente
pretty_print.pycomo un módulo local y piratearlo (eliminar lasortedllamada o lo que desee).A partir de Python 3.8:
pprint.PrettyPrinterexpone elsort_dictsparámetro de palabra clave.Verdadero de forma predeterminada, establecerlo en Falso dejará el diccionario sin clasificar.
Saldrá:
Referencia: https://docs.python.org/3/library/pprint.html
fuente
El
pprint()método simplemente invoca el__repr__()método de las cosas en él, yOrderedDictno parece hacer mucho en su método (o no tiene uno o algo).Aquí hay una solución económica que debería funcionar SI NO LE IMPORTA QUE EL PEDIDO SEA VISIBLE EN LA SALIDA DE IMPRESIÓN , lo que puede ser un gran si:
De hecho, me sorprende que no se conserve el orden ... bueno.
fuente
También puede usar esta simplificación de la respuesta kzh :
Conserva el orden y generará casi lo mismo que la respuesta webwurst ( imprimir a través de json dump ).
fuente
Para python <3.8 (por ejemplo, 3.6):
Parche mono
pprint'ssortedcon el fin de evitar que la clasificación. Esto tendrá el beneficio de que todo funcione de forma recursiva también, y es más adecuado que lajsonopción para quien necesite usar, por ejemplo, elwidthparámetro:Editar: limpieza
Para limpiar después de este sucio negocio, simplemente ejecute:
pprint.sorted = sortedPara una solución realmente limpia, incluso puede usar un administrador de contexto:
fuente
Podría redefinir
pprint()e interceptar las llamadas deOrderedDict. He aquí una ilustración sencilla. Como está escrito, elOrderedDictcódigo de anulación ignora cualquier opcionalesstream,indent,width, odepthpalabras clave que pueden haber sido pasadas, pero podría mejorarse para ponerlas en práctica. Por desgracia, esta técnica no se ocupa de ellos dentro de otro recipiente, tal como unalistdeOrderDict'sfuente
Si los elementos del diccionario son todos de un tipo, puede usar la increíble biblioteca de manejo de datos
pandas:o
fuente