2013-12-13 17 views
22

Ich möchte dieses Wörterbuch d basierend auf dem Wert der Unterschlüssel key3 in absteigender Reihenfolge sortieren. Siehe unten:Python-Wörterbuch Sortieren in absteigender Reihenfolge basierend auf Werten

d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 }, 
     '124': { 'key1': 6, 'key2': 56, 'key3': 6 }, 
     '125': { 'key1': 7, 'key2': 44, 'key3': 9 }, 
    } 

So endgültige Wörterbuch würde so aussehen.

d = { '125': { 'key1': 7, 'key2': 44, 'key3': 9 }, 
     '124': { 'key1': 6, 'key2': 56, 'key3': 6 }, 
     '123': { 'key1': 3, 'key2': 11, 'key3': 3 }, 
    } 

Mein Ansatz war ein anderes Wörterbuch e von d zu bilden, deren Schlüssel würde Wert von key3 sein und dann umgekehrt verwenden (sortiert (e)), aber da Wert von key3 gleich sein, so Wörterbuch e verloren einige die Schlüssel und ihre Werte. macht Sinn?

Wie kann ich das erreichen? Dies ist kein getesteter Code. Ich versuche nur die Logik zu verstehen.

+1

Für die Zukunft, denken Sie daran, dass '' dict'' (n) in fast jeder Sprache sind von Natur aus unsortiert definitions wird verfolgt. Die meisten Schlüssel/Wert-Zuordnungsdatentypen sind. Bitte akzeptieren Sie entweder abarnert oder ohn Zwincks Antwort (en). –

Antwort

36

Dictionaries do not have any inherent order. Oder vielmehr ist ihre inhärente Ordnung "willkürlich, aber nicht zufällig", also tut es dir nicht gut.

Mit anderen Worten, Ihre d und Ihre e wären genau gleichwertige Wörterbücher.

Was können Sie hier tun, ist ein OrderedDict zu verwenden:

from collections import OrderedDict 
d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 }, 
     '124': { 'key1': 6, 'key2': 56, 'key3': 6 }, 
     '125': { 'key1': 7, 'key2': 44, 'key3': 9 }, 
    } 
d_ascending = OrderedDict(sorted(d.items(), key=lambda kv: kv[1]['key3'])) 
d_descending = OrderedDict(sorted(d.items(), 
            key=lambda kv: kv[1]['key3'], reverse=True)) 

Die ursprüngliche d hat einige beliebige Reihenfolge. d_ascending hat die Reihenfolge gedacht Sie hatten in Ihrem ursprünglichen d aber nicht. Und d_ascending hat die Reihenfolge, die Sie für Ihre e wünschen.


Wenn Sie nicht wirklich brauchen e als Wörterbuch verwenden, möchten Sie nur in der Lage sein, über die Elemente von d in einer bestimmten Reihenfolge zu durchlaufen, können Sie dies vereinfachen:

for key, value in sorted(d.items(), key=lambda kv: kv[1]['key3'], reverse=True): 
    do_something_with(key, value) 

Wenn Sie ein Wörterbuch in sortierter Reihenfolge über alle Änderungen verwalten möchten, statt einer OrderedDict, möchten Sie eine Art von sortierten Wörterbuch. Es gibt eine Reihe von Optionen, die Sie auf PyPI finden können, einige implementiert auf Bäumen, andere auf OrderedDict, die sich selbst nach Bedarf sortiert usw.

4

Sie nutzen den folgenden Code für die Sortierung in absteigender Reihenfolge und Speicher in ein Wörterbuch machen:

 listname = [] 
     for key, value in sorted(dictionaryName.iteritems(), key=lambda (k,v): (v,k),reverse=True): 
      diction= {"value":value, "key":key} 
      listname.append(diction) 
2

Liste

dict = {'Neetu':22,'Shiny':21,'Poonam':23} 
print sorted(dict.items()) 
sv = sorted(dict.values()) 
print sv 

Wörterbuch

d = [] 
l = len(sv) 
while l != 0 : 
    d.append(sv[l - 1]) 
    l = l - 1 
print d` 
17

Eine kurze Prüfung PLE-Wörterbuch ist desending Reihenfolge zu sortieren

a1 = {'a':1, 'b':13, 'd':4, 'c':2, 'e':30} 
a1_sorted_keys = sorted(a1, key=a1.get, reverse=True) 
for r in a1_sorted_keys: 
    print r, a1[r] 

der Ausgang

e 30 
b 13 
d 4 
c 2 
a 1 
Verwandte Themen