Wie kann ich ein Wörterbuch nach Schlüssel sortieren?

Wie könnte man von "{2:3, 1:89, 4:5, 3:0}" zu "{1:89, 2:3, 3:0, 4:5}" übergehen?
Ich habe mir einige Beiträge angesehen, aber sie alle verwenden den "sort" Operator, der Tupel zurückgibt.

Lösung

Standard-Python-Dictionaries sind ungeordnet. Selbst wenn Sie die (Schlüssel-Wert)-Paare sortieren würden, wären Sie nicht in der Lage, sie in einem "Dict" so zu speichern, dass die Reihenfolge beibehalten würde.

Der einfachste Weg ist die Verwendung von OrderedDict, das sich die Reihenfolge merkt, in der die Elemente eingefügt worden sind:

In [1]: import collections

In [2]: d = {2:3, 1:89, 4:5, 3:0}

In [3]: od = collections.OrderedDict(sorted(d.items()))

In [4]: od
Out[4]: OrderedDict([(1, 89), (2, 3), (3, 0), (4, 5)])

Es ist egal, wie od ausgedruckt wird; es wird wie erwartet funktionieren:

In [11]: od[1]
Out[11]: 89

In [12]: od[3]
Out[12]: 0

In [13]: for k, v in od.iteritems(): print k, v
   ....: 
1 89
2 3
3 0
4 5

Python 3

Für Python 3 Benutzer muss man .items() anstelle von .iteritems() verwenden:

In [13]: for k, v in od.items(): print(k, v)
   ....: 
1 89
2 3
3 0
4 5
Kommentare (14)

In Wörterbüchern selbst gibt es keine geordneten Einträge, sollten Sie sie jedoch in einer bestimmten Reihenfolge ausdrucken wollen, finden Sie hier einige Beispiele:

In Python 2.4 und höher:

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

for key in sorted(mydict):
    print "%s: %s" % (key, mydict[key])

gibt:

alan: 2
bob: 1
carl: 40
danny: 3

(Python unter 2.4:)

keylist = mydict.keys()
keylist.sort()
for key in keylist:
    print "%s: %s" % (key, mydict[key])

Quelle: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/

Kommentare (1)

Wie andere bereits erwähnt haben, sind Wörterbücher von Natur aus ungeordnet. Wenn es jedoch nur darum geht, Wörterbücher geordnet anzuzeigen, können Sie die Methode __str__ in einer Wörterbuchunterklasse überschreiben und diese Wörterbuchklasse anstelle des eingebauten dict verwenden. Beispiel.

class SortedDisplayDict(dict):
   def __str__(self):
       return "{" + ", ".join("%r: %r" % (key, self[key]) for key in sorted(self)) + "}"

>>> d = SortedDisplayDict({2:3, 1:89, 4:5, 3:0})
>>> d
{1: 89, 2: 3, 3: 0, 4: 5}

Beachten Sie, dass dies nichts daran ändert, wie die Schlüssel gespeichert werden, in welcher Reihenfolge sie zurückkommen, wenn Sie über sie iterieren usw., nur wie sie mit print oder auf der Python-Konsole angezeigt werden.

Kommentare (0)