2012-04-09 10 views
3

Eine Datenstruktur wie diese.Python: Sortieren eines Diktats von Dicts auf einem Schlüssel

{ 
    'ford': {'count': 3}, 
    'mazda': {'count': 0}, 
    'toyota': {'count': 1} 
} 

Was ist der beste Weg, über den Wert von count innerhalb der Werte des Top-Level-dict zu sortieren?

>>> from collections import OrderedDict 
>>> ordered = OrderedDict(sorted(d.items(), key=lambda (k, v): v['count'])) 
>>> ordered 
OrderedDict([('mazda', {'count': 0}), ('toyota', {'count': 1}), ('ford', {'count': 3})]) 
>>> ordered.keys()   # this is guaranteed to come back in the sorted order 
['mazda', 'toyota', 'ford'] 
>>> ordered['mazda']  # still a dictionary 
{'count': 0} 

Version betrifft::

+0

Wörterbuch ist ein ungeordneter Datentyp, der nicht sortiert werden kann. Sie können 'collections.OrderedDict' verwenden. – 0xc0de

Antwort

11
d = {'ford': {'count': 3}, 
    'mazda': {'count': 0}, 
    'toyota': {'count': 1}} 

>>> sorted(d.items(), key=lambda (k, v): v['count']) 
[('mazda', {'count': 0}), ('toyota', {'count': 1}), ('ford', {'count': 3})] 

Um das Ergebnis als ein Wörterbuch zu halten, können Sie collections.OrderedDict verwendet

  • Auf Python 2.x können Sie d.iteritems() statt d.items() für besser nutzen Speichereffizienz
  • collections.OrderedDict ist nur für Python 2.7 und Python 3.2 verfügbar (a und höher)
2

Ein Diktonat ist eine ungeordnete Datenstruktur, daher kann es nicht sortiert werden. Sie könnten eine sortierte Liste (oder, in Python 2.7, ein OrderedDict) aus dem Wörterbuch d erstellen:

sorted(d.iteritems(), key=lambda item: item[1]["count"]) 

Diese Liste kann für ein collections.OrderedDict als Konstruktorargument verwendet werden.

0

Ein noch saubererer Weg wäre, itemgetter zu verwenden und dann den Wert zu verwenden, um ein geordnetes Diktat zu erstellen, wie es der andere vorgeschlagen hat.

>>> from operator import itemgetter 
>>> sorted(s,key=itemgetter,reverse=True) 
['ford', 'toyota', 'mazda'] 
0

Wenn Sie das Wörterbuch durch ein Element im Wert sortiert werden soll, kann das Ergebnis nicht als dict erhalten, weil in dict die Reihenfolge des Elements hinaus nicht erhalten bleibt. Fot, dass Sie OrderedDict verwenden müssen. Eine Lösung besteht darin, nach der Sortierung ein OrderedDict aus der Liste der (Schlüssel-, Wert-) Tupel zu erzeugen.

>>> collections.OrderedDict(sorted(d.iteritems(),key=lambda x:x[1]["count"],reverse=True)) 
OrderedDict([('ford', {'count': 3}), ('toyota', {'count': 1}), ('mazda', {'count': 0})]) 
>>> 
0

Ich denke, ein dict ist eine Hash-Tabelle, so dass man es eigentlich nicht sortieren. Versuchen Sie, die sortierten Werte in eine Liste zu speichern, die kann sortiert werden:

l = [] 
for x in sorted(dictionary.keys()): 
    l.append([dictionary[x]]) 

Wenn Sie wirklich die Schlüssel behalten möchten, vielleicht fügen Sie sie auch auf der Liste. Stellen Sie nur sicher, dass beim Zugriff auf die Liste auch Indizes (0,2,4, ...) Schlüssel und ungerade Indizes Werte sind (1,3,5, ...)

0

Wenn das Diktat Sie haben benannt x, dann können Sie eine Liste der Schlüssel erhalten: sorted_x = sortiert (x, key = lambda a: x [a] ['count']) wo sorted_x ist: ['mazda', 'toyota', 'ford']

Dann können Sie drucken: für i in sorted_x: print x [i]

Ergebnis: { 'count': 0} { 'count': 1} {‘ Anzahl': 3}

Verwandte Themen