2013-05-23 10 views

risposta

65

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

Credo lambdas è eccessivo qui, provate questo:

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

che ha funzionato, grazie – user984003

+2

Cosa succede se la chiave è una stringa, ma ho bisogno di ordinarla come int? – user984003

+0

'sorted (steps)' è migliore di 'sorted (steps.keys())' – jamylak

9

È necessario iterare su steps.items(), perché un'iterazione su dict restituisce solo le sue chiavi.

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

iterare su chiavi ordinate:

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

così allora come si fa Lo iterò sopra, come un iteritems o qualcosa del genere? – user984003

+0

@ user984003 Non è possibile ordinare un dett, è possibile ottenere solo un elenco di chiavi, valori o elementi ordinati. –

+0

@AshwiniChaudhary Non hai bisogno di un tasto '' per 'ordinato', i tasti del dizionario sono vincolati ad essere univoci così' ordinati (steps.items()) 'funziona bene – jamylak

0

A seconda del caso d'uso, potrebbe essere un'opzione tenere un dizionario già ordinato. Vedi python OrderedDict per i dettagli. Se vuoi ordinare le chiavi come numeri interi, devi convertirli in numeri interi. Il momento migliore per farlo dipende dal tuo caso d'uso.

6

È anche possibile utilizzare uno dei molti tipi di contenitore SortedDict di Python. Questi tipi mantengono automaticamente il dizionario ordinato in ordine-chiave. Dai uno sguardo al modulo sortedcontainers che è pure Python e alle implementazioni veloci come C. C'è uno performance comparison che confronta diverse altre implementazioni l'una contro l'altra.

Nel tuo caso, allora, devi usare:

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 

iterazione per chiavi/valori/articoli funziona automaticamente per ordine chiave ordinato.

1

Come indicato da Zagorulkin Dmitry, non è necessario passare un lambda alla funzione di smistamento. Il comportamento predefinito della funzione di ordinamento è quello di agire sulle chiavi.

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

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

Tuttavia, passando il lambda alla funzione di ordinamento non è un migliore funzionamento del piccolo beneficio (cioè un 'eccessivo'), ma in realtà è indesiderato. Rende il codice meno leggibile e anche più lento, in particolare se lo si applica a dizionari molto grandi o si effettua la chiamata più volte. Oltre a rendere l'obiettivo di ordinamento più esplicito rispetto alle coppie (chiave, valore), non vi è alcun vantaggio nell'utilizzarlo. I seguenti tempi mostrano il colpo di performance che ottieni quando si specifica un 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

Nel caso in cui le chiavi non sono numeri interi, ma le stringhe che dovrebbe essere analizzato come numeri interi:

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

si può usare qualcosa di simile alla soluzione:

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

1 
2 
5 
10 
Problemi correlati