Ich mag das pprint-Modul in Python. Ich benutze es oft zum Testen und Debuggen. Ich verwende häufig die Option width, um sicherzustellen, dass die Ausgabe gut in mein Terminalfenster passt.
Es hat gut funktioniert, bis sie den neuen geordneten Wörterbuchtyp in Python 2.7 hinzugefügt haben (eine weitere coole Funktion, die ich wirklich mag). Wenn ich versuche, ein bestelltes Wörterbuch hübsch auszudrucken, wird es nicht gut angezeigt. Anstatt jedes Schlüssel-Wert-Paar in einer eigenen Zeile zu haben, wird das Ganze in einer langen Zeile angezeigt, die viele Male umbrochen wird und schwer zu lesen ist.
Hat hier jemand eine Möglichkeit, es schön zu drucken, wie die alten ungeordneten Wörterbücher? Ich könnte wahrscheinlich etwas herausfinden, möglicherweise mithilfe der PrettyPrinter.format-Methode, wenn ich genug Zeit verbringe, aber ich frage mich, ob hier jemand bereits eine Lösung kennt.
UPDATE: Ich habe dafür einen Fehlerbericht eingereicht. Sie können es unter http://bugs.python.org/issue10592 sehen .
quelle
Antworten:
Als vorübergehende Problemumgehung können Sie versuchen, ein Dumping im JSON-Format durchzuführen. Sie verlieren einige Typinformationen, aber es sieht gut aus und behält die Reihenfolge bei.
quelle
pprint.pprint(dict(data))
?pprint.pprint(dict(data))
funktioniert gut, wenn Sie sich nicht um die Reihenfolge der Schlüssel kümmern. Persönlich wünschte ich mir, das__repr__
forOrderedDict
würde eine solche Ausgabe erzeugen, aber die Reihenfolge der Schlüssel beibehalten.Das Folgende funktioniert, wenn die Reihenfolge Ihres OrderedDict eine Alpha-Sortierung ist, da pprint vor dem Drucken ein Diktat sortiert.
quelle
dict
vermieden werden, dass alles in einer Zeile steht.Hier ist eine weitere Antwort, die funktioniert, indem die Bestandsfunktion
pprint()
intern überschrieben und verwendet wird . Im Gegensatz zu meinem früher man es wird handhabenOrderedDict
‚s in einem anderen Behälter, wie einlist
und soll auch gegeben alle optionales Schlüsselwort Argumente verarbeiten kann - aber es nicht das gleiche Maß an Kontrolle über die Ausgabe hat , dass der andere gewährt.Dabei wird die Ausgabe der Bestandsfunktion in einen temporären Puffer umgeleitet und anschließend mit einem Wort umbrochen, bevor sie an den Ausgabestream weitergeleitet wird. Die endgültige Ausgabe ist zwar nicht besonders hübsch, aber anständig und möglicherweise "gut genug", um sie zu umgehen.
Update 2.0
Vereinfacht durch Verwendung des Standardbibliotheksmoduls
textwrap
und geändert, um sowohl in Python 2 als auch in Python 3 zu funktionieren.Beispielausgabe:
»
{'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)])]
quelle
So drucken Sie ein bestelltes Diktat, z
ich mache
Welche ergibt
oder
was ergibt
quelle
Hier ist ein Weg, der die Implementierung von hackt
pprint
.pprint
sortiert die Schlüssel vor dem Drucken. Um die Reihenfolge zu erhalten, müssen wir die Schlüssel nur so sortieren, wie wir es möchten.Beachten Sie, dass dies Auswirkungen auf die
items()
Funktion hat. Daher möchten Sie möglicherweise die überschriebenen Funktionen nach dem Drucken beibehalten und wiederherstellen.quelle
Hier ist mein Ansatz, um ein OrderedDict hübsch zu drucken
Wenn Sie ein Wörterbuch mit Schlüsseln in sortierter Reihenfolge hübsch drucken möchten
quelle
python3
. Bitte überprüfen SieDas ist ziemlich grob, aber ich brauchte nur eine Möglichkeit, eine Datenstruktur zu visualisieren, die aus beliebigen Mappings und Iterables besteht, und das habe ich mir ausgedacht, bevor ich aufgegeben habe. Es ist rekursiv, so dass es durch verschachtelte Strukturen und Listen fällt. Ich habe die abstrakten Basisklassen Mapping und Iterable aus Sammlungen verwendet, um fast alles zu handhaben.
Ich strebte eine fast yamlartige Ausgabe mit prägnantem Python-Code an, schaffte es aber nicht ganz.
und einige Testdaten mit OrderedDict und Listen von OrderedDicts ... (Meine Güte, Python braucht sooo dringend OrderedDict-Literale ...)
ergibt folgende Ausgabe:
Ich hatte einige Gedanken auf dem Weg, str.format () für eine bessere Ausrichtung zu verwenden, hatte aber keine Lust, mich damit zu beschäftigen. Sie müssen die Feldbreiten abhängig von der gewünschten Ausrichtung dynamisch angeben, was entweder schwierig oder umständlich wird.
Auf jeden Fall zeigt mir dies meine Daten in lesbarer hierarchischer Weise, so dass das für mich funktioniert!
quelle
Los geht's ^^
oder
quelle
pprint_od()
Funktion funktioniert nicht - diefor key, item in od
Anweisung führt zu einemValueError: too many values to unpack
und die einzige eingerückte Ausgabe ist die endgültige" }"
und diekey, item
in derprint
Anweisung muss in Klammern stehen. Los geht's ^^Ich habe diesen unheiligen Affen-Patch-basierten Hack auf Python3.5 getestet und er funktioniert:
Sie
pprint
verwenden die übliche diktbasierte Zusammenfassung und deaktivieren die Sortierung für die Dauer des Anrufs, sodass keine Schlüssel zum Drucken sortiert werden.quelle
pretty_print.py
Modul auch einfach als lokales Modul kopieren und hacken (sorted
Anruf entfernen oder was auch immer Sie wollen).Ab Python 3.8:
pprint.PrettyPrinter
macht densort_dicts
Schlüsselwortparameter verfügbar.Wenn Sie den Wert standardmäßig auf " Falsch" setzen, bleibt das Wörterbuch unsortiert.
Wird ausgegeben:
Referenz: https://docs.python.org/3/library/pprint.html
quelle
Die
pprint()
Methode ruft nur die__repr__()
Methode der darin enthaltenen Dinge auf undOrderedDict
scheint in ihrer Methode nicht viel zu tun (oder hat keine oder etwas).Hier ist eine billige Lösung, die funktionieren sollte, wenn Sie sich nicht darum kümmern , dass die Bestellung im PPRINT-Ausgang sichtbar ist. Dies kann eine große Herausforderung sein , wenn:
Ich bin tatsächlich überrascht, dass die Reihenfolge nicht erhalten bleibt ... na ja.
quelle
Sie können auch diese Vereinfachung der kzh- Antwort verwenden:
Es behält die Reihenfolge bei und gibt fast die gleiche Ausgabe aus wie die Webwurst- Antwort ( Drucken über JSON-Dump ).
quelle
Für Python <3,8 (zB 3,6):
Affen-Patches
pprint
,sorted
um das Sortieren zu verhindern. Dies hat den Vorteil, dass alles auch rekursiv funktioniert, und ist besser geeignet als diejson
Option für jeden, der zBwidth
Parameter verwenden muss:Bearbeiten: Aufräumen
Um nach diesem schmutzigen Geschäft aufzuräumen, führen Sie einfach Folgendes aus:
pprint.sorted = sorted
Für eine wirklich saubere Lösung kann sogar ein Kontextmanager verwendet werden:
quelle
Sie können
pprint()
Anrufe fürOrderedDict
's neu definieren und abfangen . Hier ist eine einfache Illustration. Wie geschrieben, dieOrderedDict
ignoriert Aufhebungscode alle optionalenstream
,indent
,width
, oderdepth
Schlüsselwörter , die weitergegeben worden sein, könnte aber verbessert werden , um sie umzusetzen. Leider werden sie mit dieser Technik nicht in einem anderen Container wie einemlist
vonOrderDict
's behandeltquelle
Wenn die Wörterbuchelemente alle von einem Typ sind, können Sie die erstaunliche Datenverarbeitungsbibliothek verwenden
pandas
:oder
quelle