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?

python 

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))

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
}

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))

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.


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)

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)

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())])

0

Ein weiterer kurzer Oneliner:

mydict = {'c': 1, 'b': 2, 'a': 3}
print(*sorted(mydict.items()), sep='\n')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.