2008-09-10 5 views
11

Wörterbücher im Gegensatz zu Listen sind nicht geordnet (und haben nicht das Attribut 'sort'). Daher können Sie sich nicht darauf verlassen, dass die Elemente beim ersten Hinzufügen in der gleichen Reihenfolge angezeigt werden.Wie können Sie in Python einfach sortierte Elemente aus einem Wörterbuch abrufen?

Was ist der einfachste Weg, ein Wörterbuch mit Strings als Schlüsselwert zu durchlaufen und sie in aufsteigender Reihenfolge nach Schlüssel abzurufen?

Zum Beispiel hatte man dies:

d = {'b' : 'this is b', 'a': 'this is a' , 'c' : 'this is c'} 

Ich möchte die zugehörigen Werte in der folgenden Reihenfolge nach Schlüssel sortiert drucken:

this is a 
this is b 
this is c 

Antwort

1

Dieser Code-Schnipsel wird dies tun. Wenn Sie es häufig tun, möchten Sie vielleicht eine "Sortkeys" -Methode machen oder so etwas machen, um es für die Augen zu erleichtern.

keys = list(d.keys()) 
keys.sort() 
for key in keys: 
    print d[key] 

Edit: dF-Lösung ist besser - ich habe alles über sortierte vergessen().

+0

Ja, aber sortiert ist nicht verfügbar in älterem Python (vor 2.4), so dass dieses Idiom ist nach wie vor sinnvoll. – jmanning2k

16

Meinen Sie, dass Sie die Werte nach dem Wert des Schlüssels sortiert benötigen? In diesem Fall sollte es tun:

for key in sorted(d): 
    print d[key] 

EDIT: geändert sortiert verwenden (d) statt sortiert (d.keys()), dank Eli!

+1

Sie können einfach nur sagen "für den Schlüssel in sortierten (d):", ohne zu sagen "d.keys()" seit Iterieren über ein Wörterbuch nur über seine Schlüssel iteriert. –

16

oder kürzer,

for key, value in sorted(d.items()): 
    print value 
+0

nicht nur sortiert - vermeidet die Lookups –

+0

was genau meinen Sie mit "vermeidet die Lookups"? führt es zu einer besseren Leistung? –

+1

@Ray: Ja, die Verwendung von "Schlüssel, Wert" in der for-Schleife vermeidet die Hash-Tabelle Lookup von d [Schlüssel] für jedes Element im Wörterbuch zu tun. Ich glaube, dass die obige Lösung schneller sein wird, aber Sie müssen es sicher auf Ihrem System und Ihrem Datensatz messen. –

1
>>> d = {'b' : 'this is b', 'a': 'this is a' , 'c' : 'this is c'} 
>>> for k,v in sorted(d.items()): 
...  print v, k 
... 
this is a a 
this is b b 
this is c c 
0
d = {'b' : 'this is b', 'a': 'this is a' , 'c' : 'this is c'} 
ks = d.keys() 
ks.sort() 
for k in ks: 
    print "this is " + k 
1
for key in sorted(d): 
    print d[key] 
1

Sie können auch ein Wörterbuch nach Wert sortieren und die Sortierreihenfolge steuern:

import operator 

d = {'b' : 'this is 3', 'a': 'this is 2' , 'c' : 'this is 1'} 

for key, value in sorted(d.iteritems(), key=operator.itemgetter(1), reverse=True): 
    print key, " ", value 

Ausgang:
b dieses ist 3
a dies ist 2
c dies ist 1

0

Meinst du "sortiert" statt "bestellt"? Ihre Frage zielt darauf ab, ein Wörterbuch zu sortieren und nicht zu bestellen. Wenn Sie "geordnet" meinen, können Sie ein OrderedDict aus dem Sammlungsmodul verwenden. Diese Wörterbücher erinnern, in welcher Reihenfolge die Schlüssel/Wert-Paare eingegeben wurden:

from collections import OrderedDict 

Referenzinformationen: https://docs.python.org/2/library/collections.html#collections.OrderedDict