2009-03-23 13 views
14

Ich habe ein Wörterbuch wie bekam:Wie wiederhole ich ein Python-Wörterbuch, sortiert nach Werten?

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

ich darübervon Wert iterieren möchten, nicht durch Schlüssel. Mit anderen Worten:

(b, 1) 
(c, 2) 
(a, 6) 

Was ist der einfachste Weg?

+0

Duplikat http://stackoverflow.com/questions/613183/sort-a-dictionary-in-python-by-the-value –

+2

Nicht eine Betrogene. Der andere möchte ein Wörterbuch sortieren, was unmöglich ist. Ich möchte über ein Wörterbuch in sortierter Reihenfolge iterieren. – mike

+0

und der Code ist genau der gleiche. – SilentGhost

Antwort

30
sorted(dictionary.items(), key=lambda x: x[1]) 

für diese von Ihnen, die Lambda-

:-) Hass erfordert
import operator 
sorted(dictionary.items(), key=operator.itemgetter(1)) 

jedoch operator Version CPython 2.5+

+0

Ich brauche die Schlüssel und die Gegenstände, nicht nur die Gegenstände. – mike

+0

dictionary.items() gibt Ihnen sowohl die Schlüssel und Werte, nicht nur die Schlüssel. –

+1

@Mike: Elemente sind (Schlüssel, Wert) Paare. – vartec

3

Die items Methode eine Liste von (Schlüssel, Wert) Tupel gibt, die mit sorted und einem benutzerdefinierten Sortierschlüssel sortiert werden kann:

Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 

>>> a={ 'a': 6, 'b': 1, 'c': 2 } 
>>> sorted(a.items(), key=lambda (key,value): value) 
[('b', 1), ('c', 2), ('a', 6)] 

In Python 3 muss der Lambda-Ausdruck in lambda x: x[1] geändert werden.

+0

Vielleicht möchten Sie die ersten drei Zeilen entfernen und die letzte ... sieht gerade etwas beschäftigt aus. –

+1

Beachten Sie, dass Tupel-Entpacken in Python 3 nicht mehr unterstützt wird ... leider. – Stephan202

+0

@Nikhil Ich denke, der Header ist wichtig. Besonders per @ Stephans Kommentar ist es wichtig, welche Version ich für die Demo verwende. –

7

Für Nicht-Python 3-Programme sollten Sie iteritems verwenden, um die Leistungssteigerung von Generatoren zu erzielen, die Werte nacheinander ausgeben, anstatt alle gleichzeitig zurückzugeben.

sorted(d.iteritems(), key=lambda x: x[1]) 

Für noch größeren Wörterbücher, können wir einen Schritt weiter gehen und die Tastenfunktion be in C statt Python, wie es jetzt mit dem Lambda ist.

import operator 
sorted(d.iteritems(), key=operator.itemgetter(1)) 

Hurra!

+0

Ooah. Nett mit dem operator.itemgetter. Süss. –

+0

Obwohl ich nicht getestet habe, bin ich skeptisch gegenüber der Behauptung, dass 'sortierte' auf einem konsumierbaren Iterator besser funktioniert als auf einer Liste. Ich würde vermuten, dass das Erste, was "sortiert" ist, diesen Iterator in eine Liste liest; Es ist sehr unklar, ob hier ein Leistungsgewinn zu erzielen ist. –

4

Es kann oft sehr nützlich sein, namedtuple zu verwenden. Zum Beispiel haben Sie ein Wörterbuch des Namens und der Gäste und Sie wollen auf ‚Score‘ sortieren:

import collections 
Player = collections.namedtuple('Player', 'score name') 
d = {'John':5, 'Alex':10, 'Richard': 7} 

mit dem niedrigsten Punktzahl Sortierung zuerst:

worst = sorted(Player(v,k) for (k,v) in d.items()) 

Sortierung mit der höchsten Punktzahl zuerst:

Die Reihenfolge von 'Schlüssel' und 'Wert' in den aufgeführten Tupeln ist (Wert, Schlüssel), aber jetzt können Sie den Namen und die Punktzahl von, sagen wir, den zweitbesten Spieler (Index = 1) sehr pythonisch so:

player = best[1] 
    player.name 
     'Richard' 
    player.score 
     7 
Verwandte Themen