2013-05-23 12 views

Antwort

65

I need to iterate over this is sorted order by the key.

Ich denke lambdas Overkill hier ist, versuchen Sie dies:

>>> steps = {1:"val1", 5:"val2", 2:"val3"} 
>>> 
>>> for key in sorted(steps): 
...  print steps[key] 
... 
val1 
val3 
val2 
+1

das hat funktioniert, danke – user984003

+2

Was ist, wenn der Schlüssel eine Zeichenfolge ist, aber ich muss es als Int sortieren? – user984003

+0

'sortierte (Schritte)' ist besser als 'sortierte (steps.keys())' – jamylak

9

Sie müssen über steps.items() iterieren, da eine Iteration über dict nur die Schlüssel zurückgibt.

>>> x = sorted(steps.items()) 
>>> x 
[(1, 'value1'), (2, 'value3'), (5, 'value2')] 

Iterate über sortierter Schlüssel:

>>> for key in sorted(steps): 
...  # use steps[keys] to get the value 
+0

so dann, wie zu tun Ich wiederhole es, wie ein Iteritems oder etwas? – user984003

+0

@ user984003 Sie können ein Diktat nicht sortieren, Sie können nur eine Liste sortierter Schlüssel, Werte oder Elemente erhalten. –

+0

@AshwiniChaudhary Sie brauchen überhaupt keinen 'Schlüssel' für' sorted', Dictionary Keys müssen eindeutig sein, also 'sorted (steps.items())' funktioniert gut – jamylak

0

auf Ihren Anwendungsfall abhängig, könnte es eine Option sein ein bereits bestelltes Wörterbuch zu halten. Siehe Pythons OrderedDict für Details. Wenn Sie die Schlüssel als Ganzzahl sortieren möchten, müssen Sie sie in ganze Zahlen konvertieren. Der beste Zeitpunkt dafür hängt von Ihrem Anwendungsfall ab.

6

Sie können auch einen der vielen SortedDict-Containertypen von Python verwenden. Diese Typen verwalten das Wörterbuch automatisch in der Reihenfolge der Schlüssel. Sehen Sie sich das Modul sortedcontainers an, das reine Python- und Fast-as-C-Implementierungen ist. Es gibt eine , die mehrere andere Implementierungen gegeneinander abgleicht.

In Ihrem Fall dann würden Sie verwenden:

from sortedcontainers import SortedDict 
steps = SortedDict({1:"value1", 5:"value2", 2:"value3"}) 

# Then iterate the items: 

for key, value in steps.items(): 
    print key, value 

# Or iterate the values: 

for value in steps.values(): 
    print value 

Iteration für Schlüssel/Werte/Elemente erfolgt automatisch durch sortierten Schlüssel um.

1

Wie von Zagorulkin Dmitry hingewiesen, sollten Sie nicht ein Lambda an die Sortierfunktion übergeben. Das Standardverhalten der Sortierfunktion besteht darin, auf die Schlüssel einzuwirken.

steps = {1:"val1", 5:"val2", 2:"val3"} 

for key in sorted(steps): 
    print steps[key] 
... 
val1 
val3 
val2 

ist jedoch das Lambda zur Sortierfunktion vorbei kein besserer Betrieb von kleinem Vorteile (das heißt ein ‚Overkill‘), aber es ist eigentlich unerwünscht. Es macht den Code weniger lesbar und es ist auch langsamer, besonders wenn Sie es auf sehr große Wörterbücher anwenden oder den Anruf mehrmals durchführen. Abgesehen davon, dass das Sortierziel in Bezug auf die Paare (Schlüssel, Wert) expliziter ist, hat es keinen Vorteil, es zu verwenden. Die folgenden Timings zeigen den Performance-Hit, den Sie bei der Angabe eines Lambda erhalten.

steps = {randint(0, 100000): randint(0, 100000) for _ in range(100000) } # random dict 

%%timeit 
sort_list = [value for _, value in sorted(steps.items(), key=lambda item: item[0])] 
1 loops, best of 3: 241 ms per loop 

%%timeit 
sort_list = [steps[k] for k in sorted(steps, key=lambda k: k)] 
1 loops, best of 3: 196 ms per loop 

%%timeit 
sort_list = [ steps[key] for key in sorted(steps) ] 
10 loops, best of 3: 106 ms per loop 
0

Falls Sie Ihre Schlüssel sind keine ganzen Zahlen, aber Strings, die als ganze Zahlen analysiert werden sollten:

steps = {'1':'value1', '10': 'value0', '5':'value2', '2':'value3'} 

Sie etwas ähnliches zu Ihrer Lösung verwenden können:

for key, value in sorted(steps, key=lambda key: int(key[0])): 
    print(key) 

1 
2 
5 
10 
Verwandte Themen