Drucken Sie lesbar ein Python-Diktat () aus, das nach Schlüsseln sortiert ist

81

Ich möchte ein Python-Wörterbuch mit PrettyPrinter (aus Gründen der Lesbarkeit) in eine Datei drucken, das Wörterbuch jedoch nach Schlüssel in der Ausgabedatei sortieren lassen, um die Lesbarkeit weiter zu verbessern. Damit:

mydict = {'a':1, 'b':2, 'c':3}
pprint(mydict)

druckt derzeit an

{'b':2,
 'c':3,
 'a':1}

Ich möchte das Wörterbuch PrettyPrint, aber es nach Schlüssel sortiert ausdrucken lassen, z.

{'a':1,
 'b':2,
 'c':3}

Was ist der beste Weg, dies zu tun?


quelle
Es stellt sich heraus, dass der Druck bereits nach Schlüssel sortiert ist. Hätte das genauer prüfen sollen.

Antworten:

94

Tatsächlich scheint pprint die Schlüssel für Sie unter python2.5 zu sortieren

>>> from pprint import pprint
>>> mydict = {'a':1, 'b':2, 'c':3}
>>> pprint(mydict)
{'a': 1, 'b': 2, 'c': 3}
>>> mydict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
>>> pprint(mydict)
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
>>> d = dict(zip("kjihgfedcba",range(11)))
>>> pprint(d)
{'a': 10,
 'b': 9,
 'c': 8,
 'd': 7,
 'e': 6,
 'f': 5,
 'g': 4,
 'h': 3,
 'i': 2,
 'j': 1,
 'k': 0}

Aber nicht immer unter Python 2.4

>>> from pprint import pprint
>>> mydict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
>>> pprint(mydict)
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
>>> d = dict(zip("kjihgfedcba",range(11)))
>>> pprint(d)
{'a': 10,
 'b': 9,
 'c': 8,
 'd': 7,
 'e': 6,
 'f': 5,
 'g': 4,
 'h': 3,
 'i': 2,
 'j': 1,
 'k': 0}
>>> 

Beim Lesen des Quellcodes von pprint.py (2.5) wird das Wörterbuch sortiert

items = object.items()
items.sort()

für mehrzeilig oder dies für einzeilig

for k, v in sorted(object.items()):

Bevor es versucht, etwas zu drucken. Wenn Ihr Wörterbuch also richtig sortiert ist, sollte es richtig drucken. In 2.4 fehlt die zweite sortierte () (existierte damals nicht), sodass Objekte, die in einer einzelnen Zeile gedruckt werden, nicht sortiert werden.

Die Antwort scheint also Python2.5 zu sein, obwohl dies Ihre Ausgabe in der Frage nicht ganz erklärt.

Python3-Update

Hübscher Druck nach sortierten Schlüsseln (Lambda x: x [0]):

for key, value in sorted(dict_example.items(), key=lambda x: x[0]): 
    print("{} : {}".format(key, value))

Hübscher Druck nach sortierten Werten (Lambda x: x [1]):

for key, value in sorted(dict_example.items(), key=lambda x: x[1]): 
    print("{} : {}".format(key, value))
Nick Craig-Wood
quelle
Die Lambda-Ausdruckslösung Python 3 ist schick. Aus Gründen der Klarheit, glaube ich (?) keyIn for key, value in ...unabhängig davon ist , keyin key=lambda ...wie dies funktioniert, for k,v in sorted(token_dict.items(), key=lambda x: x[0])sondern for k,v in sorted(token_dict.items(), k=lambda x: x[0])wirft einen Fehler.
Victoria Stuart
18

Eine andere Alternative:

>>> mydict = {'a':1, 'b':2, 'c':3}
>>> import json

Dann mit python2:

>>> print json.dumps(mydict, indent=4, sort_keys=True) # python 2
{
    "a": 1, 
    "b": 2, 
    "c": 3
}

oder mit Python 3:

>>> print(json.dumps(mydict, indent=4, sort_keys=True)) # python 3
{
    "a": 1, 
    "b": 2, 
    "c": 3
}
Skippy le Grand Gourou
quelle
14

Eine einfache Möglichkeit, den sortierten Inhalt des Wörterbuchs in Python 3 zu drucken:

>>> dict_example = {'c': 1, 'b': 2, 'a': 3}
>>> for key, value in sorted(dict_example.items()):
...   print("{} : {}".format(key, value))
... 
a : 3
b : 2
c : 1

Der Ausdruck dict_example.items()gibt Tupel zurück, die dann sortiert werden können nach sorted():

>>> dict_example.items()
dict_items([('c', 1), ('b', 2), ('a', 3)])
>>> sorted(dict_example.items())
[('a', 3), ('b', 2), ('c', 1)]

Unten finden Sie ein Beispiel, um den sortierten Inhalt der Werte eines Python-Wörterbuchs hübsch auszudrucken.

for key, value in sorted(dict_example.items(), key=lambda d_values: d_values[1]): 
    print("{} : {}".format(key, value))
Zweedeend
quelle
Sehr schön. Hier ist ein Beispiel, um den sortierten Inhalt eines Python-Wörterbuchs hübsch auszudrucken:for key, value in sorted(dict_example.items(), key=lambda d_items: d_items[1]): print("{} : {}".format(key, value))
Scott Skiles
1
@ScottSkiles Sie sollten die Antwort bearbeiten und Ihr Beispiel hinzufügen - ich denke, es würde zukünftigen Lesern helfen
redbeam_
13

Das Python - pprintModul tatsächlich bereits sortiert Wörter Schlüssel. In Versionen vor Python 2.5 wurde die Sortierung nur für Wörterbücher ausgelöst, deren hübsch gedruckte Darstellung mehrere Zeilen umfasste. In 2.5.X und 2.6.X werden jedoch alle Wörterbücher sortiert.

Wenn Sie jedoch Datenstrukturen in eine Datei schreiben und diese für Menschen lesbar und beschreibbar sein möchten, sollten Sie im Allgemeinen ein alternatives Format wie YAML oder JSON verwenden. Wenn Ihre Benutzer nicht selbst Programmierer sind, kann es eine frustrierende und fehleranfällige Aufgabe sein , wenn sie den Konfigurations- oder Anwendungsstatus beibehalten, über den sie gespeichert pprintund geladen werden eval.

rcoder
quelle
2
Übrigens ast.literal_eval("{'a': 0, 'b': 1, 2: 'c'}")-> {2: 'c', 'a': 0, 'b': 1}es besteht also keine Notwendigkeit für gottlose eval.
JFS
Ja, und anscheinend bietet pprint keine Möglichkeit, dieses Verhalten auszuschalten. Verschwendete ein oder zwei Stunden, um herauszufinden, warum einige Druckmuster-Berichtsdaten nach Schlüsseln sortiert wurden.
Samantha Atkins
12

Ich habe die folgende Funktion geschrieben, um Diktate, Listen und Tupel in einem besser lesbaren Format zu drucken:

def printplus(obj):
    """
    Pretty-prints the object passed in.

    """
    # Dict
    if isinstance(obj, dict):
        for k, v in sorted(obj.items()):
            print u'{0}: {1}'.format(k, v)

    # List or tuple            
    elif isinstance(obj, list) or isinstance(obj, tuple):
        for x in obj:
            print x

    # Other
    else:
        print obj

Beispiel für die Verwendung in iPython:

>>> dict_example = {'c': 1, 'b': 2, 'a': 3}
>>> printplus(dict_example)
a: 3
b: 2
c: 1

>>> tuple_example = ((1, 2), (3, 4), (5, 6), (7, 8))
>>> printplus(tuple_example)
(1, 2)
(3, 4)
(5, 6)
(7, 8)
Scott Foubister
quelle
5

Ich hatte das gleiche Problem wie du. Ich habe eine for-Schleife mit der sortierten Funktion verwendet, die im Wörterbuch wie folgt übergeben wird:

for item in sorted(mydict):
    print(item)
Hühnerfisch
quelle
4

Sie könnten dieses Diktat ein wenig transformieren, um sicherzustellen, dass (da Diktate nicht intern sortiert bleiben), z

pprint([(key, mydict[key]) for key in sorted(mydict.keys())])
Cat Plus Plus
quelle
0

Ein weiterer kurzer Oneliner:

mydict = {'c': 1, 'b': 2, 'a': 3}
print(*sorted(mydict.items()), sep='\n')
Friedrich
quelle