J'aime le module pprint en Python. Je l'utilise beaucoup pour tester et déboguer. J'utilise fréquemment l'option width pour m'assurer que la sortie s'intègre parfaitement dans la fenêtre de mon terminal.
Cela a bien fonctionné jusqu'à ce qu'ils ajoutent le nouveau type de dictionnaire ordonné dans Python 2.7 (une autre fonctionnalité intéressante que j'aime vraiment). Si j'essaie d'imprimer un dictionnaire ordonné, il ne s'affiche pas bien. Au lieu d'avoir chaque paire clé-valeur sur sa propre ligne, le tout apparaît sur une longue ligne, qui s'enroule plusieurs fois et est difficile à lire.
Quelqu'un ici a-t-il un moyen de le faire imprimer correctement, comme les anciens dictionnaires non ordonnés? Je pourrais probablement trouver quelque chose, peut-être en utilisant la méthode PrettyPrinter.format, si je passe suffisamment de temps, mais je me demande si quelqu'un ici connaît déjà une solution.
MISE À JOUR: J'ai déposé un rapport de bogue pour cela. Vous pouvez le voir sur http://bugs.python.org/issue10592 .
la source
Réponses:
Pour contourner le problème, vous pouvez essayer de vider au format JSON. Vous perdez des informations de type, mais elles sont belles et conservent l'ordre.
la source
pprint.pprint(dict(data))
?pprint.pprint(dict(data))
fonctionne bien si vous ne vous souciez pas de l'ordre des clés. Personnellement, je souhaite que le__repr__
forOrderedDict
produise une sortie comme celle-ci mais conserve l'ordre des touches.Ce qui suit fonctionnera si l'ordre de votre OrderedDict est un tri alpha, puisque pprint triera un dict avant l'impression.
la source
dict
devrait éviter que tout soit placé sur une seule ligne.Voici une autre réponse qui fonctionne en remplaçant et en utilisant la
pprint()
fonction stock en interne. Contrairement à mon antérieur il se gérerOrderedDict
est dans un autre récipient tel qu'unlist
et devrait également être capable de gérer tous les arguments mot - clé donné en option - mais il n'a pas le même degré de contrôle sur la sortie que l'autre donnait.Il fonctionne en redirigeant la sortie de la fonction stock dans un tampon temporaire, puis le mot encapsule cela avant de l'envoyer au flux de sortie. Bien que la sortie finale produite ne soit pas exceptionnellement jolie, elle est décente et peut être "assez bonne" pour être utilisée comme solution de contournement.
Mise à jour 2.0
Simplifié en utilisant le
textwrap
module de bibliothèque standard et modifié pour fonctionner à la fois en Python 2 et 3.Exemple de sortie:
»
{'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)])]
la source
Pour imprimer un dict ordonné, par exemple
je fais
Quels rendements
ou
qui donne
la source
Voici un moyen de pirater la mise en œuvre de
pprint
.pprint
trie les clés avant l'impression, donc pour préserver l'ordre, il suffit de faire trier les clés comme nous le souhaitons.Notez que cela a un impact sur la
items()
fonction. Vous voudrez peut-être conserver et restaurer les fonctions remplacées après avoir effectué le pprint.la source
Voici mon approche pour imprimer un OrderedDict
Si vous voulez imprimer un joli dictionnaire avec des clés dans un ordre trié
la source
python3
. S'il vous plaît vérifierC'est assez grossier, mais j'avais juste besoin d'un moyen de visualiser une structure de données composée de mappages et d'itérables arbitraires et c'est ce que j'ai trouvé avant d'abandonner. C'est récursif, donc il passera par les structures imbriquées et les listes très bien. J'ai utilisé les classes de base abstraites Mapping et Iterable des collections pour gérer à peu près tout.
Je visais une sortie presque yaml avec un code Python concis, mais je n'ai pas tout à fait réussi.
et quelques données de test en utilisant OrderedDict et des listes de OrderedDicts ... (sheesh Python a tellement besoin de littéraux OrderedDict ...)
donne la sortie suivante:
J'ai eu quelques réflexions sur l'utilisation de str.format () pour un meilleur alignement, mais je n'avais pas envie de creuser dedans. Vous auriez besoin de spécifier dynamiquement les largeurs de champ en fonction du type d'alignement souhaité, ce qui deviendrait soit délicat, soit encombrant.
Quoi qu'il en soit, cela me montre mes données de manière hiérarchique lisible, donc cela fonctionne pour moi!
la source
Et voilà ^^
ou
la source
pprint_od()
fonction ne fonctionne pas - l'for key, item in od
instruction donne unValueError: too many values to unpack
et la seule sortie indentée est la finale" }"
et lekey, item
dans l'print
instruction doit être entre parenthèses. Et voilà ^^J'ai testé ce hack basé sur un patch de singe impie sur python3.5 et cela fonctionne:
Vous
pprint
utilisez le récapitulatif habituel basé sur dict et désactivez également le tri pendant la durée de l'appel afin qu'aucune clé ne soit réellement triée pour l'impression.la source
pretty_print.py
tant que module local et le pirater (en supprimant l'sorted
appel ou ce que vous voulez).À partir de Python 3.8:
pprint.PrettyPrinter
expose lesort_dicts
paramètre de mot - clé.True par défaut, le définir sur False laissera le dictionnaire non trié.
Sortira:
Référence: https://docs.python.org/3/library/pprint.html
la source
La
pprint()
méthode appelle simplement la__repr__()
méthode des choses qu'elleOrderedDict
contient , et ne semble pas faire grand-chose dans sa méthode (ou n'en a pas ou quelque chose).Voici une solution bon marché qui devrait fonctionner SI VOUS NE VOUS SOUHAITEZ PAS QUE LA COMMANDE EST VISIBLE DANS LA SORTIE PPRINT , ce qui peut être un gros si:
Je suis en fait surpris que l'ordre ne soit pas conservé ... eh bien.
la source
Vous pouvez également utiliser cette simplification de la réponse kzh :
Il préserve l'ordre et produira presque la même chose que la réponse webwurst ( impression via json dump ).
la source
Pour python <3,8 (par exemple 3,6):
Patch Monkey
pprint
« ssorted
afin de l' empêcher de tri. Cela aura l'avantage que tout fonctionne de manière récursive également, et est plus approprié que l'json
option pour quiconque doit utiliser par exemple lewidth
paramètre:Edit: nettoyer
Pour nettoyer après cette sale affaire, lancez simplement:
pprint.sorted = sorted
Pour une solution vraiment propre, vous pouvez même utiliser un contextmanager:
la source
Vous pouvez redéfinir
pprint()
et intercepter les appelsOrderedDict
. Voici une illustration simple. Comme il est écrit, leOrderedDict
code de dérogation ignore toutes les optionsstream
,indent
,width
ou desdepth
mots - clés qui peuvent avoir été transmis, mais il pourrait être amélioré pour les mettre en œuvre. Malheureusement, cette technique ne les gère pas dans un autre conteneur, comme unlist
ofOrderDict
'sla source
Si les éléments du dictionnaire sont tous d'un même type, vous pouvez utiliser l'étonnante bibliothèque de gestion des données
pandas
:ou
la source