2012-06-06 8 views
5

Ich habe die folgende Liste der Wörterbüchereine Liste von dicts von dict Sortieren von Werten

a = [{23:100}, {3:103}, {2:102}, {36:103}, {43:123}] 

Wie ich es sortieren zu bekommen:

a = [{43:123}, {3:103}, {36:103}, {2:102}, {23:100}] 

I, durch seine dicts die Liste zu sortieren bedeuten 'Werte in absteigender Reihenfolge.

+0

Jede dieser Wörterbücher haben verschiedene Schlüssel. Gibt es dafür einen besseren Datentyp? – tlunter

Antwort

1

Sie können einen key Parameter an die list.sort()-Methode übergeben, so wird der Vergleich in Abhängigkeit von der Rückkehr Wert von key vorgenommen werden:

>>> a = [{23:100}, {3:103}, {2:102}, {36:103}, {43:123}] 
>>> a.sort(key=lambda d: d.values()[0], reversed=True) 
>>> a 
[{23: 100}, {2: 102}, {3: 103}, {36: 103}, {43: 123}] 

In diesem Fall ist der Schlüssel eine Funktion, die einen Wörterbuch empfängt d und erhält eine Liste seines Wertes mit .values(). Da es nur einen Wert gibt, erhalten wir diesen einzigen Wert aus der zurückgegebenen Liste. Dann vergleicht die list.sort() Methode diese zurückgegebenen Werte anstelle der Wörterbücher selbst beim Sortieren.

+0

Dies ergibt eine Sortierung in aufsteigender Reihenfolge, die OP wollte abnehmen. – raym0nd

+2

@ raym0nd ok, repariert, obwohl ich sagen sollte, würde ich sowieso HodfHod Lösung bevorzugen :) – brandizzi

3
>>> sorted(a, key=lambda i: i.values()[0], reverse=True) 
[{43: 123}, {3: 103}, {36: 103}, {2: 102}, {23: 100}] 
6

Neben Antwort des Brandizzi, könnten Sie mit gehen:

sorted(a, key=dict.values, reverse=True) 

So ziemlich das Gleiche, aber möglicherweise mehr idiomatische.

+0

+1 Ich stimme zu, das ist die bessere Antwort, es sei denn, die Frage gibt an, dass nur das erste Element für die Sortierung verwendet werden. – jamylak

+0

hey, wie kann ich den Wert aus dem sortierten "a" dict extrahieren, um int zu empfangen? z.B. 'für b in a: Drucken a [i] .keys() i + = 1' aber Python sagt, es ist immer noch eine Liste, ich muss int empfangen. Wie kann ich es tun ? – user1403568

+0

@ user1403568 versuchen 'für b in a: print b.keys() [0]'. das wird die Schlüssel extrahieren, so dass Sie am Ende ausdrucken: 43, 3, 36, 2, 23. Wenn Sie stattdessen Werte (wie 123,103,36,102,100) wollen, verwenden Sie 'b.values ​​() [0]'. – HodofHod

0

Ich würde eher verwenden (oder zumindest im Auge behalten) .itervalues()

In [25]: sorted(a, key=lambda x: x.itervalues().next, reverse=True) 
Out[25]: [{43: 123}, {36: 103}, {2: 102}, {23: 100}, {3: 103}] 
Verwandte Themen