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
który działał, dziękuje – user984003
Co jeśli klucz jest ciągiem, ale muszę go posortować jako int? – user984003
'posortowane (kroki)' jest lepsze niż 'posortowane (steps.keys())' – jamylak