Druckwörterbuch in mehreren Zeilen

78

Ich versuche, einen hübschen Ausdruck eines Wörterbuchs zu bekommen, aber ich habe kein Glück:

>>> import pprint
>>> a = {'first': 123, 'second': 456, 'third': {1:1, 2:2}}
>>> pprint.pprint(a)
{'first': 123, 'second': 456, 'third': {1: 1, 2: 2}}

Ich wollte, dass die Ausgabe in mehreren Zeilen erfolgt, ungefähr so:

{'first': 123,
 'second': 456,
 'third': {1: 1,
           2: 2}
}

Kann pprintdas? Wenn nicht, welches Modul dann? Ich benutze Python 2.7.3 .

mulllhausen
quelle
Beantwortet das deine Frage? Wie drucke ich verschachtelte Wörterbücher hübsch?
Georgy
@ George nicht ganz. Die gewünschte Ausgabe in dieser Frage ist nicht die gleiche wie meine hier
Mulllhausen

Antworten:

96

Verwenden Sie width=1oder width=-1:

In [33]: pprint.pprint(a, width=1)
{'first': 123,
 'second': 456,
 'third': {1: 1,
           2: 2}}
Warren Weckesser
quelle
1
Was machen negative Breiten?
Tim
1
@ Tim: Ich habe es gerade versucht und es hat funktioniert, aber ich weiß nicht, ob das irgendwo dokumentiert ist.
Warren Weckesser
1
Negative Breiten machen nichts Besonderes. Während der Code überprüft, wird überprüft, ob die Länge der Teilausgabezeichenfolge gleich ist < width. Jede negative Breite bedeutet nur, dass die Antwort immer "Nein" lautet. Eine Breite von 0 wird fast immer (oder vielleicht immer - es ist mir nicht wichtig genug, über perverse Fälle nachzudenken ;-)) dasselbe tun.
Tim Peters
1
@ TimPeters: Ja, ich habe mir die Quelle angesehen. Es gibt eine Überprüfung auf width == 0 (es wird ein Fehler ausgelöst), aber es scheint, dass 0 genauso wie ein negativer Wert behandelt werden könnte - antworten Sie immer mit "nein", wie Sie es ausdrücken - ohne Schaden.
Warren Weckesser
37

Sie könnten das Diktat in json durch konvertieren json.dumps(d, indent=4)

print(json.dumps(item, indent=4))
{
    "second": 456,
    "third": {
        "1": 1,
        "2": 2
    },
    "first": 123
}
Ryan Chou
quelle
Viel schöner als die anderen Lösungen
Erik Aronesty
4
@ErikAronesty Während Sie auf die nullund booleschen Werte (true / false) achten sollten . Dies sind JSON-Werte, nicht die Python-Objekte.
Ryan Chou
Okay, Lösung für einfache Fälle, aber konvertiert Python-Werte in JSON-Werte (wie @RyanChou hervorhob) und es ist möglicherweise nicht wünschenswert oder möglich (wie bei datetime): json.dumps({'d': datetime.now()})stürzt mit ab Object of type datetime is not JSON serializable.
Andrey
25

Wenn Sie versuchen, die Umgebungsvariablen hübsch zu drucken, verwenden Sie:

pprint.pprint(dict(os.environ), width=1)
UngodlySpoon
quelle
4

Zwei Dinge, die Sie zusätzlich zu Ryan Chous bereits sehr hilfreicher Antwort hinzufügen sollten:

  • sort_keysÜbergeben Sie das Argument für eine einfachere visuelle Darstellung Ihres Diktats, insb. wenn Sie mit Python vor 3.6 arbeiten (in dem Wörterbücher ungeordnet sind)
print(json.dumps(item, indent=4, sort_keys=True))
"""
{
    "first": 123,
    "second": 456,
    "third": {
        "1": 1,
        "2": 2
    }
}
"""
  • dumps() funktioniert nur, wenn die Wörterbuchschlüssel Grundelemente sind (Zeichenfolgen, int usw.)
Zach Valenta
quelle
Ordentlich! sort_keysist ein gutes Argument. Leider, wie Sie sagen, nicht immer zutreffend: TypeError: Object of type Tag is not JSON serializable...
PatrickT