¿Cómo puedo imprimir un diccionario con una profundidad de ~ 4 en Python? Intenté imprimir bien con pprint()
, pero no funcionó:
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(mydict)
Simplemente quiero una sangría ( "\t"
) para cada anidamiento, para obtener algo como esto:
key1
value1
value2
key2
value1
value2
etc.
¿Cómo puedo hacer esto?
python
dictionary
Martineau
fuente
fuente
Respuestas:
No estoy seguro de cómo desea exactamente que se vea el formato, pero podría comenzar con una función como esta:
fuente
__future__
que ahora menciona la respuesta, por lo que debe emplearlos donde sea necesario (o actualizar a 3 ya).python def pretty(d, indent=0): for key, value in d.items(): if isinstance(value, dict): print(' ' * indent + str(key)) pretty(value, indent+1) else: print(' ' * (indent+1) + f"{key}: {value}")
Lo primero que pensé fue que el serializador JSON probablemente sea bastante bueno en los diccionarios anidados, por lo que haría trampa y usaría eso:
fuente
Puedes probar YAML a través de PyYAML . Su salida se puede ajustar. Sugeriría comenzar con lo siguiente:
print yaml.dump(data, allow_unicode=True, default_flow_style=False)
El resultado es muy legible; también se puede analizar de nuevo a Python si es necesario.
Editar:
Ejemplo:
fuente
float
y unanumpy.float64
A partir de lo que se ha hecho, no veo ninguna impresora bonita que al menos imite la salida del intérprete de Python con un formato muy simple, así que aquí está el mío:
Para inicializarlo:
Puede admitir la adición de formateadores para tipos definidos, simplemente necesita hacer una función para eso como esta y vincularla al tipo que desee con set_formater:
Por razones históricas, mantengo la bonita impresora anterior, que era una función en lugar de una clase, pero ambas se pueden usar de la misma manera, la versión de clase simplemente permite mucho más:
Para usarlo:
En comparación con otras versiones:
fuente
de esta manera puede imprimirlo de manera bonita, por ejemplo, el nombre de su diccionario es yasin
fuente
Otra opción con
yapf
:Salida:
fuente
Como otros han publicado, puede usar recursividad / dfs para imprimir los datos del diccionario anidados y llamar recursivamente si es un diccionario; de lo contrario imprima los datos.
fuente
Una de las formas más pitónicas para eso es usar el módulo pprint ya construido .
El argumento que necesita para definir la profundidad de impresión es el que puede esperar.
depth
Eso es !
fuente
pout puede imprimir cualquier cosa que le arrojes, por ejemplo (tomando prestado
data
de otra respuesta):daría como resultado una salida impresa en la pantalla como:
o puede devolver la salida de cadena formateada de su objeto:
Su caso de uso principal es para la depuración, por lo que no se ahoga en instancias de objetos ni nada y maneja la salida unicode como era de esperar, funciona en python 2.7 y 3.
divulgación : soy el autor y mantenedor de pout.
fuente
Tomé la respuesta de sth y la modifiqué ligeramente para satisfacer mis necesidades de diccionarios y listas anidados:
Lo que luego me da salida como:
fuente
Sth, me hundo, eso es bonito;)
fuente
list
valores que no sondict
instancias, es decirpretty({'key': [1, 2, 3]}, indent=4)
==>AttributeError: 'int' object has no attribute 'iteritems'
. Tampoco me gusta mayúsculas.fuente
Escribí este código simple para imprimir la estructura general de un objeto json en Python.
el resultado para los siguientes datos
es muy compacto y se ve así:
fuente
Soy un novato en Python, pero he estado trabajando con diccionarios anidados durante las últimas dos semanas y esto es lo que se me ocurrió.
Deberías intentar usar una pila. Convierta las claves del diccionario raíz en una lista de una lista:
Yendo en orden inverso de último a primero, busque cada clave en el diccionario para ver si su valor es (también) un diccionario. Si no, imprima la clave y luego bórrela. Sin embargo, si el valor de la clave es un diccionario, imprima la clave, luego agregue las claves para ese valor al final de la pila y comience a procesar esa lista de la misma manera, repitiendo recursivamente para cada nueva lista de claves.
Si el valor de la segunda clave en cada lista fuera un diccionario, tendría algo como esto después de varias rondas:
La ventaja de este enfoque es que la sangría es solo
\t
veces la longitud de la pila:La desventaja es que para verificar cada clave, debe pasar al sub-diccionario relevante, aunque esto se puede manejar fácilmente con una comprensión de la lista y un
for
bucle simple :Tenga en cuenta que este enfoque requerirá que limpie las listas vacías finales, y que elimine la última clave de cualquier lista seguida de una lista vacía (que, por supuesto, puede crear otra lista vacía, etc.).
Hay otras formas de implementar este enfoque, pero con suerte esto le dará una idea básica de cómo hacerlo.
EDITAR: si no desea pasar por todo eso, el
pprint
módulo imprime diccionarios anidados en un formato agradable.fuente
Aquí hay una función que escribí en función del comentario de sth. Funciona igual que json.dumps con sangría, pero estoy usando pestañas en lugar de espacio para sangrías. En Python 3.2+ puede especificar que la sangría sea un '\ t' directamente, pero no en 2.7.
Ex:
fuente
Aquí hay algo que imprimirá cualquier tipo de diccionario anidado, mientras realiza un seguimiento de los diccionarios "principales" en el camino.
Este es un buen punto de partida para imprimir según diferentes formatos, como el especificado en OP. Todo lo que realmente necesita hacer es realizar operaciones alrededor de los bloques Imprimir . Tenga en cuenta que se ve para ver si el valor es 'OrderedDict ()'. Dependiendo de si está utilizando algo de las colecciones de tipos de datos de contenedor , debe hacer este tipo de seguridad para que el bloque elif no lo vea como un diccionario adicional debido a su nombre. A partir de ahora, un diccionario de ejemplo como
imprimirá
~ alterar el código para que se ajuste al formato de la pregunta ~
Usando el mismo código de ejemplo, imprimirá lo siguiente:
Esto no es exactamente lo que se solicita en OP. La diferencia es que un padre ^ n todavía se imprime, en lugar de estar ausente y reemplazado con espacios en blanco. Para llegar al formato de OP, deberá hacer algo como lo siguiente: comparar iterativamente dicList con lastDict . Usted puede hacer esto haciendo un nuevo diccionario y copiar contenido de dicList a ella, comprobando si i en el diccionario copiado es lo mismo que yo en lastDict, y - si es - escritura espacio en blanco para que i posición usando la función de cadena multiplicador .
fuente
Desde este enlace :
fuente
Sólo estoy volviendo a esta pregunta después de tomar algo respuestas 's y hacer una pequeña pero muy útil modificación. Esta función imprime todas las claves en el árbol JSON , así como el tamaño de los nodos hoja en ese árbol.
Es realmente agradable cuando tienes grandes objetos JSON y quieres descubrir dónde está la carne. Ejemplo :
Esto le indicaría que la mayoría de los datos que le interesan probablemente estén dentro
JSON_object['key1']['key2']['value2']
porque la longitud de ese valor formateado como una cadena es muy grande.fuente
Utiliza esta función:
Llámalo así:
fuente
Esto es lo que se me ocurrió mientras trabajaba en una clase que necesitaba escribir un diccionario en un archivo .txt:
Ahora, si tenemos un diccionario como este:
Y nosotros hacemos:
Obtenemos:
fuente