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?
Antworten:
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
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))
quelle
key
Infor key, value in ...
unabhängig davon ist ,key
inkey=lambda ...
wie dies funktioniert,for k,v in sorted(token_dict.items(), key=lambda x: x[0])
sondernfor k,v in sorted(token_dict.items(), k=lambda x: x[0])
wirft einen Fehler.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 }
quelle
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 nachsorted()
:>>> 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))
quelle
for key, value in sorted(dict_example.items(), key=lambda d_items: d_items[1]): print("{} : {}".format(key, value))
Das Python -
pprint
Modul 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
pprint
und geladen werdeneval
.quelle
ast.literal_eval("{'a': 0, 'b': 1, 2: 'c'}")
->{2: 'c', 'a': 0, 'b': 1}
es besteht also keine Notwendigkeit für gottloseeval
.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)
quelle
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)
quelle
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())])
quelle
Ein weiterer kurzer Oneliner:
mydict = {'c': 1, 'b': 2, 'a': 3} print(*sorted(mydict.items()), sep='\n')
quelle