Comment puis-je imprimer un joli dictionnaire avec une profondeur de ~ 4 en Python? J'ai essayé de jolies impressions avec pprint()
, mais cela n'a pas fonctionné:
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(mydict)
Je veux simplement une indentation ( "\t"
) pour chaque imbrication, afin d'obtenir quelque chose comme ceci:
key1
value1
value2
key2
value1
value2
etc.
Comment puis-je faire ceci?
python
dictionary
martineau
la source
la source
Réponses:
Je ne sais pas exactement à quoi vous voulez que le formatage ressemble, mais vous pouvez commencer avec une fonction comme celle-ci:
la source
__future__
celui-ci, la réponse mentionne maintenant, vous devez donc les utiliser là où vous en avez besoin (ou passer à 3 déjà).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}")
Ma première pensée a été que le sérialiseur JSON est probablement assez bon pour les dictionnaires imbriqués, donc je tricherais et l'utiliserais:
la source
Vous pouvez essayer YAML via PyYAML . Sa sortie peut être affinée. Je suggère de commencer par ce qui suit:
print yaml.dump(data, allow_unicode=True, default_flow_style=False)
Le résultat est très lisible; il peut également être analysé en Python si nécessaire.
Éditer:
Exemple:
la source
float
et anumpy.float64
D'après ce qui a été fait, je ne vois aucune jolie imprimante qui imite au moins la sortie de l'interpréteur python avec un formatage très simple alors voici le mien:
Pour l'initialiser:
Il peut prendre en charge l'ajout de formateurs pour les types définis, il vous suffit de créer une fonction pour celle-ci comme celle-ci et de la lier au type souhaité avec set_formater:
Pour des raisons historiques, je garde la jolie imprimante précédente qui était une fonction au lieu d'une classe, mais elles peuvent toutes les deux être utilisées de la même manière, la version de classe permet simplement beaucoup plus:
Pour l'utiliser :
Par rapport aux autres versions:
la source
de cette façon, vous pouvez l'imprimer de manière jolie, par exemple le nom de votre dictionnaire est yasin
la source
Une autre option avec
yapf
:Production:
la source
Comme d'autres l'ont publié, vous pouvez utiliser récursivité / dfs pour imprimer les données du dictionnaire imbriqué et appeler de manière récursive s'il s'agit d'un dictionnaire; sinon imprimez les données.
la source
la moue peut imprimer tout ce que vous lui lancez, par exemple (en empruntant
data
à une autre réponse):entraînerait une sortie imprimée à l'écran comme:
ou vous pouvez renvoyer la sortie de chaîne formatée de votre objet:
Son cas d'utilisation principal est pour le débogage afin qu'il ne s'étouffe pas sur les instances d'objets ou quoi que ce soit et qu'il gère la sortie Unicode comme vous vous en doutez, fonctionne en python 2.7 et 3.
divulgation : je suis l'auteur et le mainteneur de la moue.
la source
L'un des moyens les plus pythoniques pour cela est d'utiliser le module pprint déjà construit .
L'argument dont vous avez besoin pour définir la profondeur d'impression est celui auquel vous vous attendez
depth
C'est tout !
la source
J'ai pris la réponse de sth et l'ai légèrement modifiée pour l'adapter à mes besoins de dictionnaires et de listes imbriqués:
Ce qui me donne alors une sortie comme:
la source
Sth, je coule c'est joli;)
la source
list
valeurs qui ne sont pas desdict
instances, c'est-à-direpretty({'key': [1, 2, 3]}, indent=4)
==>AttributeError: 'int' object has no attribute 'iteritems'
. Je n'aime pas non plus les majuscules.la source
J'ai écrit ce code simple pour imprimer la structure générale d'un objet json en Python.
le résultat pour les données suivantes
est très compact et ressemble à ceci:
la source
Je suis moi-même un débutant en python, mais je travaille avec des dictionnaires imbriqués depuis quelques semaines et c'est ce que j'avais trouvé.
Vous devriez essayer d'utiliser une pile. Transformez les clés du dictionnaire racine en une liste de liste:
En allant dans l'ordre inverse du dernier au premier, recherchez chaque clé dans le dictionnaire pour voir si sa valeur est (également) un dictionnaire. Sinon, imprimez la clé puis supprimez-la. Cependant, si la valeur de la clé est un dictionnaire, imprimez la clé, puis ajoutez les clés de cette valeur à la fin de la pile et commencez à traiter cette liste de la même manière, en répétant de manière récursive pour chaque nouvelle liste de clés.
Si la valeur de la deuxième clé de chaque liste était un dictionnaire, vous auriez quelque chose comme ceci après plusieurs tours:
L'avantage de cette approche est que le retrait est juste
\t
multiplié par la longueur de la pile:L'inconvénient est que pour vérifier chaque clé, vous devez hacher le sous-dictionnaire correspondant, bien que cela puisse être géré facilement avec une compréhension de la liste et une
for
boucle simple :N'oubliez pas que cette approche vous obligera à nettoyer les listes vides de fin et à supprimer la dernière clé de toute liste suivie d'une liste vide (ce qui peut bien sûr créer une autre liste vide, etc.).
Il existe d'autres façons de mettre en œuvre cette approche, mais j'espère que cela vous donne une idée de base de la façon de le faire.
EDIT: Si vous ne voulez pas passer par tout cela, le
pprint
module imprime les dictionnaires imbriqués dans un format agréable.la source
Voici une fonction que j'ai écrite sur la base du commentaire de qc. Cela fonctionne de la même manière que json.dumps avec le retrait, mais j'utilise des tabulations au lieu de l'espace pour les retraits. Dans Python 3.2+, vous pouvez spécifier que le retrait soit un '\ t' directement, mais pas dans 2.7.
Ex:
la source
Voici quelque chose qui imprimera n'importe quelle sorte de dictionnaire imbriqué, tout en gardant une trace des dictionnaires "parents" en cours de route.
Il s'agit d'un bon point de départ pour l'impression selon différents formats, comme celui spécifié dans OP. Tout ce que vous avez vraiment besoin de faire est d'opérer autour des blocs d' impression . Notez qu'il cherche à voir si la valeur est 'OrderedDict ()'. Selon que vous utilisez quelque chose à partir des collections de types de données Container , vous devez créer ce type de sécurité pour que le bloc elif ne le considère pas comme un dictionnaire supplémentaire en raison de son nom. Pour l'instant, un exemple de dictionnaire comme
imprimera
~ modification du code pour l'adapter au format de la question ~
En utilisant le même exemple de code, il imprimera ce qui suit:
Ce n'est pas exactement ce qui est demandé dans OP. La différence est qu'un parent ^ n est toujours imprimé, au lieu d'être absent et remplacé par un espace blanc. Pour accéder au format OP, vous devrez faire quelque chose comme ceci: comparer de manière itérative dicList avec le lastDict . Vous pouvez le faire en créant un nouveau dictionnaire et en y copiant le contenu de dicList, en vérifiant si i dans le dictionnaire copié est le même que i dans lastDict, et - si c'est le cas - en écrivant des espaces dans cette position i en utilisant la fonction multiplicateur de chaîne .
la source
De ce lien :
la source
Je reviens juste à cette question après avoir pris la réponse de qc et fait une petite mais très utile modification. Cette fonction imprime toutes les clés de l'arborescence JSON ainsi que la taille des nœuds feuilles de cette arborescence.
C'est vraiment bien quand vous avez de gros objets JSON et que vous voulez savoir où se trouve la viande. Exemple :
Cela vous dirait que la plupart des données qui vous intéressent se trouvent probablement à l'intérieur
JSON_object['key1']['key2']['value2']
car la longueur de cette valeur formatée en chaîne est très grande.la source
Utilisez cette fonction:
Appelez ça comme ceci:
la source
Voici ce que j'ai trouvé en travaillant sur une classe qui avait besoin d'écrire un dictionnaire dans un fichier .txt:
Maintenant, si nous avons un dictionnaire comme celui-ci:
Et nous faisons:
On a:
la source