Domanda Iterare sui dizionari usando i cicli "for"


Sono un po 'perplesso dal seguente codice:

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    print key, 'corresponds to', d[key]

Quello che non capisco è il key porzione. In che modo Python riconosce che è sufficiente leggere la chiave dal dizionario? È key una parola speciale in Python? O è semplicemente una variabile?


2104
2017-07-20 22:27


origine


risposte:


key è solo un nome variabile.

for key in d:

semplicemente passerà in rassegna i tasti nel dizionario, piuttosto che le chiavi e i valori. Per eseguire il loop su chiave e valore è possibile utilizzare quanto segue:

Per Python 2.x:

for key, value in d.iteritems():

Per Python 3.x:

for key, value in d.items():

Per testare per te stesso, cambia la parola key a poop.

Per Python 3.x, iteritems() è stato sostituito con semplicemente items(), che restituisce una vista di tipo setata dal ditt, come iteritems() ma ancora meglio. Questo è disponibile anche in 2.7 come viewitems().

L'operazione items() funzionerà sia per 2 che per 3, ma in 2 restituirà una lista di dizionari (key, value) coppie, che non riflettono le modifiche al dict che si verificano dopo il items() chiamata. Se si desidera il comportamento 2.x in 3.x, è possibile chiamare list(d.items()).


3781
2017-07-20 22:29



Non è che la chiave sia una parola speciale, ma quei dizionari implementano il protocollo iteratore. Potresti farlo nella tua classe, ad es. vedere questa domanda per come costruire iteratori di classe.

Nel caso dei dizionari, è implementato a livello C. I dettagli sono disponibili in PEP 234. In particolare, la sezione intitolata "Iterator dei dizionari":

  • I dizionari implementano uno slot tp_iter che restituisce un efficiente   iteratore che itera sulle chiavi del dizionario. [...] Questo   significa che possiamo scrivere

    for k in dict: ...
    

    che è equivalente a, ma molto più veloce di

    for k in dict.keys(): ...
    

    fintanto che la restrizione sulle modifiche al dizionario   (sia dal loop o da un altro thread) non vengono violati.

  • Aggiungi metodi ai dizionari che restituiscono diversi tipi di   iteratori esplicitamente:

    for key in dict.iterkeys(): ...
    
    for value in dict.itervalues(): ...
    
    for key, value in dict.iteritems(): ...
    

    Ciò significa che for x in dict è una scorciatoia per for x in dict.iterkeys().


325
2017-07-20 23:52



Iterating over a dict scorre le sue chiavi in ​​nessun ordine particolare, come puoi vedere qui:

Modifica: (Questo è non è più il caso in Python3.6, ma nota che lo è non garantito comportamento ancora)

>>> d = {'x': 1, 'y': 2, 'z': 3} 
>>> list(d)
['y', 'x', 'z']
>>> d.keys()
['y', 'x', 'z']

Per il tuo esempio, è un'idea migliore da usare dict.items():

>>> d.items()
[('y', 2), ('x', 1), ('z', 3)]

Questo ti dà una lista di tuple. Quando li passi in loop in questo modo, ogni tupla viene spacchettata dentro k e v automaticamente:

for k,v in d.items():
    print(k, 'corresponds to', v)

utilizzando k e v come nomi di variabili quando si esegue il ciclo su a dict è abbastanza comune se il corpo del loop è composto da poche righe. Per i loop più complicati può essere una buona idea usare nomi più descrittivi:

for letter, number in d.items():
    print(letter, 'corresponds to', number)

È una buona idea prendere l'abitudine di utilizzare le stringhe di formato:

for letter, number in d.items():
    print('{0} corresponds to {1}'.format(letter, number))

151
2017-07-21 01:27



key è semplicemente una variabile.

Per python2.X:

d = {'x': 1, 'y': 2, 'z': 3} 
for my_var in d:
    print my_var, 'corresponds to', d[my_var]

... o meglio,

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.iteritems():
    print the_key, 'corresponds to', the_value

Per Python3.X:

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.items():
    print(the_key, 'corresponds to', the_value)

42
2017-07-20 23:49



Quando si scorre i dizionari usando il for .. in ..-sintassi, itera sempre sulle chiavi (i valori sono accessibili usando dictionary[key]).

Per ripetere le coppie chiave-valore, utilizzare for k,v in s.iteritems().


39
2017-07-20 22:29



Questo è un idioma di loop molto comune. in è un operatore. Per quando usarlo for key in dict e quando deve essere for key in dict.keys() vedere Articolo di Idiomatic Python di David Goodger.


20
2017-07-20 22:42



Puoi usare questo:

for key,val in d.items():
    print key, 'is the key for ', val

9
2018-01-14 14:42



Ho un caso d'uso in cui devo ripetere il ditt per ottenere la chiave, coppia di valori, anche l'indice che indica dove sono. Ecco come lo faccio:

d = {'x': 1, 'y': 2, 'z': 3} 
for i, (key, value) in enumerate(d.items()):
   print(i, key, value)

Si noti che le parentesi attorno alla chiave, il valore è importante, senza le parentesi, si ottiene un errore ValueError "valori insufficienti da decomprimere".


6
2018-05-25 13:42