2013-05-23 19 views

Odpowiedz

65

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

myślę lambdas jest przesadą tutaj, spróbuj tego:

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

który działał, dziękuje – user984003

+2

Co jeśli klucz jest ciągiem, ale muszę go posortować jako int? – user984003

+0

'posortowane (kroki)' jest lepsze niż 'posortowane (steps.keys())' – jamylak

9

Musisz powtórzyć nad steps.items(), ponieważ iteracja nad dictem zwraca tylko jego klucze.

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

iteracyjne nad klucze segregowanych:

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

tak to w jaki sposób I iteracje nad tym, jak iteritems czy coś takiego? – user984003

+0

@ user984003 Nie możesz sortować dyktowania, możesz otrzymać tylko listę posortowanych kluczy, wartości lub przedmiotów. –

+0

@AshwiniChaudhary Nie potrzebujesz 'klucza' dla' posortowanego' w ogóle, klucze słownika są powiązane, więc 'posortowane (steps.items())' działa dobrze – jamylak

0

zależności od przypadku użycia, może to być opcja trzymać już uporządkowany słownik. Zobacz pytony OrderedDict w celu uzyskania szczegółowych informacji. Jeśli chcesz posortować klucze jako liczby całkowite, musisz przekonwertować je na liczby całkowite. Najlepszy moment na zrobienie tego zależy od twojego przypadku użycia.

6

Można również użyć jednego z wielu typów kontenerów SortedDict w Pythonie. Te typy automatycznie utrzymują słownik posortowany w kolejności alfabetycznej. Spójrz na moduł sortedcontainers, który jest czystym Pythonem i szybkimi implementacjami C. Jest performance comparison, który testuje kilka innych implementacji względem siebie.

W twoim przypadku wówczas, można użyć:

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 

iteracji dla kluczy/wartości/przedmiotów działa automatycznie posortowanych klucza.

1

Jak wskazał Zagorulkin Dmitry, nie należy przekazywać lambda do funkcji sortowania. Domyślnym działaniem funkcji sortowania jest działanie na klawiszach.

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

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

Jednak przechodząc lambda do funkcji sortowania nie jest lepsze funkcjonowanie małych korzyści (to jest „overkill”), ale w rzeczywistości jest to niepożądane. Powoduje, że kod jest mniej czytelny, a także wolniejszy, szczególnie jeśli zamierzasz zastosować go do bardzo dużych słowników lub wykonać połączenie wiele razy. Poza tym, że cel sortowania jest bardziej wyraźny w odniesieniu do par (klucza, wartości), nie ma korzyści z jego używania. Poniższe czasy pokazują wydajność, jaką osiągasz podczas określania lambda.

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

W przypadku klucze nie są liczbami całkowitymi, ale struny, które powinny być analizowane jako liczby całkowite:

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

można użyć coś podobnego do rozwiązania:

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

1 
2 
5 
10 
Powiązane problemy