Wie kann ich in Python ein Wörterbuch mit einer Tiefe von ~ 4 drucken? Ich habe versucht, hübsch zu drucken pprint()
, aber es hat nicht funktioniert:
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(mydict)
Ich möchte einfach eine Einrückung ( "\t"
) für jede Verschachtelung, damit ich so etwas bekomme:
key1
value1
value2
key2
value1
value2
etc.
Wie kann ich das machen?
python
dictionary
Martineau
quelle
quelle
Antworten:
Ich bin mir nicht sicher, wie genau die Formatierung aussehen soll, aber Sie könnten mit einer Funktion wie dieser beginnen:
quelle
__future__
solche Hacks nicht richtig verarbeitet werden kann. In der Antwort wird dies nun erwähnt. Sie müssen diese also überall dort einsetzen, wo sie benötigt werden (oder bereits auf 3 aktualisieren).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}")
Mein erster Gedanke war, dass der JSON-Serializer wahrscheinlich ziemlich gut in verschachtelten Wörterbüchern ist, also würde ich das betrügen und verwenden:
quelle
Sie können YAML über PyYAML ausprobieren . Der Ausgang kann fein eingestellt werden. Ich würde vorschlagen, mit folgendem zu beginnen:
print yaml.dump(data, allow_unicode=True, default_flow_style=False)
Das Ergebnis ist sehr gut lesbar; Bei Bedarf kann es auch zurück in Python analysiert werden.
Bearbeiten:
Beispiel:
quelle
float
und a erwartetnumpy.float64
Nach dem, was getan wurde, sehe ich keinen hübschen Drucker, der zumindest die Ausgabe des Python-Interpreters mit sehr einfacher Formatierung nachahmt. Hier ist meiner:
So initialisieren Sie es:
Es kann das Hinzufügen von Formatierern für definierte Typen unterstützen. Sie müssen lediglich eine Funktion für diese erstellen und diese mit set_formater an den gewünschten Typ binden:
Aus historischen Gründen behalte ich den vorherigen hübschen Drucker, der eine Funktion anstelle einer Klasse war, aber beide können auf die gleiche Weise verwendet werden. Die Klassenversion erlaubt einfach viel mehr:
Um es zu benutzen :
Im Vergleich zu anderen Versionen:
quelle
Auf diese Weise können Sie es auf hübsche Weise drucken, zum Beispiel, wenn Ihr Wörterbuchname yasin ist
quelle
Eine weitere Option mit
yapf
:Ausgabe:
quelle
Wie andere gepostet haben, können Sie mit rekursion / dfs die verschachtelten Wörterbuchdaten drucken und rekursiv aufrufen, wenn es sich um ein Wörterbuch handelt. Andernfalls drucken Sie die Daten.
quelle
Eine der pythonischsten Möglichkeiten hierfür ist die Verwendung des bereits erstellten pprint- Moduls.
Das Argument, das Sie zum Definieren der Drucktiefe benötigen, ist wie erwartet
depth
Das ist es !
quelle
Schmollmund kann alles drucken, was Sie darauf werfen, zum Beispiel (Ausleihen
data
aus einer anderen Antwort):würde zu einer Ausgabe führen, die auf dem Bildschirm gedruckt wird wie:
oder Sie können die formatierte Zeichenfolgenausgabe Ihres Objekts zurückgeben:
Der Hauptanwendungsfall ist das Debuggen, damit es nicht an Objektinstanzen oder Ähnlichem erstickt und die Unicode-Ausgabe wie erwartet verarbeitet. Dies funktioniert in Python 2.7 und 3.
Offenlegung : Ich bin der Autor und Betreuer von Schmollmund.
quelle
Ich nahm die Antwort von etw und änderte sie leicht, um sie an die Bedürfnisse verschachtelter Wörterbücher und Listen anzupassen:
Was mir dann Ausgabe gibt wie:
quelle
Sth, ich versinke das ist hübsch;)
quelle
list
Werte, die keinedict
Instanzen sind, dhpretty({'key': [1, 2, 3]}, indent=4)
==>AttributeError: 'int' object has no attribute 'iteritems'
. Ich mag es auch nicht, Tasten in Großbuchstaben zu schreiben.quelle
Ich habe diesen einfachen Code geschrieben, um die allgemeine Struktur eines JSON-Objekts in Python zu drucken.
das Ergebnis für die folgenden Daten
ist sehr kompakt und sieht so aus:
quelle
Ich bin selbst ein relativer Python-Neuling, aber ich habe in den letzten Wochen mit verschachtelten Wörterbüchern gearbeitet, und das hatte ich mir ausgedacht.
Sie sollten versuchen, einen Stapel zu verwenden. Machen Sie die Schlüssel aus dem Stammwörterbuch zu einer Liste einer Liste:
Suchen Sie in umgekehrter Reihenfolge vom letzten zum ersten nach jedem Schlüssel im Wörterbuch, um festzustellen, ob sein Wert (auch) ein Wörterbuch ist. Wenn nicht, drucken Sie den Schlüssel und löschen Sie ihn. Wenn der Wert für den Schlüssel jedoch ein Wörterbuch ist, drucken Sie den Schlüssel aus, hängen Sie die Schlüssel für diesen Wert an das Ende des Stapels an und beginnen Sie mit der Verarbeitung dieser Liste auf die gleiche Weise, wobei Sie sie für jede neue Schlüsselliste rekursiv wiederholen.
Wenn der Wert für den zweiten Schlüssel in jeder Liste ein Wörterbuch wäre, hätten Sie nach mehreren Runden so etwas:
Der Vorteil dieses Ansatzes besteht darin, dass der Einzug nur die doppelte
\t
Länge des Stapels beträgt:Der Nachteil ist, dass Sie zum Überprüfen jedes Schlüssels das entsprechende Unterwörterbuch durchsuchen müssen, obwohl dies mit einem Listenverständnis und einer einfachen
for
Schleife leicht zu handhaben ist :Beachten Sie, dass Sie bei diesem Ansatz nachfolgende leere Listen bereinigen und den letzten Schlüssel in einer Liste löschen müssen, gefolgt von einer leeren Liste (wodurch natürlich eine weitere leere Liste erstellt werden kann usw.).
Es gibt andere Möglichkeiten, diesen Ansatz zu implementieren, aber hoffentlich gibt Ihnen dies eine grundlegende Vorstellung davon, wie es geht.
BEARBEITEN: Wenn Sie das alles nicht durchgehen möchten,
pprint
druckt das Modul verschachtelte Wörterbücher in einem schönen Format.quelle
Hier ist eine Funktion, die ich basierend auf dem Kommentar von etw geschrieben habe. Es funktioniert genauso wie json.dumps mit Einzug, aber ich verwende Tabulatoren anstelle von Leerzeichen für Einrückungen. In Python 3.2+ können Sie den Einzug direkt als '\ t' angeben, jedoch nicht in 2.7.
Ex:
quelle
Hier ist etwas, das jede Art von verschachteltem Wörterbuch druckt und dabei die "übergeordneten" Wörterbücher verfolgt.
Dies ist ein guter Ausgangspunkt für das Drucken in verschiedenen Formaten, wie dem in OP angegebenen. Alles, was Sie wirklich tun müssen, sind Operationen um die Druckblöcke . Beachten Sie, dass der Wert "OrderedDict ()" lautet. Abhängig davon, ob Sie etwas aus Container-Datentypen-Sammlungen verwenden , sollten Sie diese Art von Fail-Safes erstellen, damit der elif- Block es aufgrund seines Namens nicht als zusätzliches Wörterbuch ansieht . Ab sofort ein Beispielwörterbuch wie
wird gedruckt
~ Code an das Format der Frage anpassen ~
Mit demselben Beispielcode wird Folgendes gedruckt:
Dies ist nicht genau das , was in OP angefordert wird. Der Unterschied besteht darin, dass ein übergeordnetes Element immer noch gedruckt wird, anstatt abwesend zu sein und durch Leerzeichen ersetzt zu werden. Um zum OP-Format zu gelangen, müssen Sie Folgendes tun: Vergleichen Sie dicList iterativ mit lastDict . Sie können dies tun, indem Sie ein neues Wörterbuch erstellen und den Inhalt von dicList in dieses kopieren, prüfen, ob i im kopierten Wörterbuch mit i in lastDict identisch ist, und - falls dies der Fall ist - mithilfe der Zeichenfolgenmultiplikatorfunktion Leerzeichen an diese i- Position schreiben .
quelle
Von diesem Link :
quelle
Ich komme gerade auf diese Frage zurück, nachdem ich die Antwort von etw genommen und eine kleine, aber sehr nützliche Änderung vorgenommen habe. Diese Funktion druckt alle Schlüssel im JSON-Baum sowie die Größe der Blattknoten in diesem Baum.
Es ist wirklich schön, wenn Sie große JSON-Objekte haben und herausfinden möchten, wo sich das Fleisch befindet. Beispiel :
Dies würde Ihnen sagen, dass sich die meisten Daten, die Sie interessieren, wahrscheinlich im Inneren befinden,
JSON_object['key1']['key2']['value2']
da die Länge dieses als Zeichenfolge formatierten Werts sehr groß ist.quelle
Verwenden Sie diese Funktion:
Nennen Sie es so:
quelle
Folgendes habe ich mir bei der Arbeit an einer Klasse ausgedacht, die ein Wörterbuch in eine TXT-Datei schreiben musste:
Wenn wir nun ein Wörterbuch wie dieses haben:
Und wir tun:
Wir bekommen:
quelle