2009-09-25 11 views
60

Ich möchte ein Python-Wörterbuch mit PrettyPrinter (für menschliche Lesbarkeit) in eine Datei drucken, aber das Wörterbuch nach Schlüssel in der Ausgabedatei sortieren, um die Lesbarkeit weiter zu verbessern. Also:Python dict() sortiert nach Schlüssel lesen

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

derzeit druckt

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

Ich möchte das Wörterbuch Schön aber haben es aus durch Schlüssel zB sortiert gedruckt.

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

Was ist der beste Weg, dies zu tun?

+0

Stellt sich heraus, dass pprint bereits nach Schlüssel sortiert. Hätte das sorgfältiger überprüfen sollen. –

Antwort

69

Eigentlich pprint scheint die Schlüssel für Sie unter python2.5

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

Lesen des Quellcodes von pprint.py zu sortieren (2.5) es tut sortieren Sie die Wörterbuch

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

für mehrzeilige oder diese für einzelne Zeile mit

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

, bevor es versucht, etwas zu drucken, also wenn Ihr Wörterbuch richtig sortiert, dann sollte es richtig drucken. In 2.4 fehlt die zweite sorted() (war damals nicht vorhanden), so dass Objekte, die auf einer einzelnen Zeile gedruckt werden, nicht sortiert werden.

Also die Antwort scheint zu verwenden Python2.5, obwohl dies Ihre Ausgabe in der Frage nicht ganz erklären.

3

Sie könnten dieses Diktat ein wenig umwandeln, um sicherzustellen, dass (wie Dicts intern nicht sortiert werden), z.

pprint([(key, mydict[key]) for key in sorted(mydict.keys())]) 
12

Das Python pprint Modul tatsächlich bereits sortiert Wörter Schlüssel. In Versionen vor Python 2.5 wurde die Sortierung nur bei Wörterbüchern ausgelöst, deren hübsch gedruckte Darstellung mehrere Zeilen umfasste, aber in 2.5.X und 2.6.X sind alle Wörterbücher sortiert.

Wenn Sie jedoch Datenstrukturen in eine Datei schreiben und sie les- und schreibbar machen möchten, sollten Sie ein alternatives Format wie YAML oder JSON in Betracht ziehen. Sofern Ihre Benutzer selbst keine Programmierer sind, kann es eine frustrierende und fehleranfällige Aufgabe sein, sie über pprint zu halten und über eval geladen zu haben.

+2

btw, 'ast.literal_eval (" {'a': 0, 'b': 1, 2: 'c'} ")' -> '{2: 'c', 'a': 0, 'b' : 1} 'also gibt es keine Notwendigkeit für gottloses' eval'. – jfs

11

schrieb ich die folgende Funktion dicts, Listen und Tupeln in einem besser lesbaren Format 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) 
3

Ich hatte das gleiche Problem Sie hatten.I verwenden eine for-Schleife mit der sortierten Funktion im Wörterbuch vorbei etwa so:

for item in sorted(mydict): 
    print(item) 
10

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

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

Die Expressions dict_example.items() kehrt Tupel, die von sorted() können dann sortiert werden:

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

Sehr schön. Hier ist ein Beispiel, um die sortierten Inhalte eines Python-Wörterbuchs hübsch auszudrucken: 'für Schlüssel, Wert in sortiert (dict_example.items(), Schlüssel = lambda d_items: d_items [1]): print (" {}: {} ".format (Schlüssel, Wert))" –

8

Eine weitere Alternative:

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