Scorrere i dizionari usando i cicli 'for'
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
...
In che modo Python riconosce che deve solo leggere la chiave dal dizionario? Chiave è una parola speciale in Python? O è semplicemente una variabile?
Non sono solo for
loop. La parola importante qui è "iterare".
Un dizionario è una mappatura delle chiavi ai valori:
d = {'x': 1, 'y': 2, 'z': 3}
Ogni volta che ripetiamo, ripetiamo le chiavi. Il nome della variabile key
deve essere solo descrittivo - ed è abbastanza adatto allo scopo.
Questo accade nella comprensione di un elenco:
>>> [k for k in d]
['x', 'y', 'z']
Succede quando passiamo il dizionario all'elenco (o qualsiasi altro oggetto del tipo di raccolta):
>>> list(d)
['x', 'y', 'z']
Il modo in cui Python itera è, in un contesto in cui è necessario, chiama il __iter__
metodo dell'oggetto (in questo caso il dizionario) che restituisce un iteratore (in questo caso, un oggetto keyiterator):
>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>
Non dovremmo usare questi metodi speciali noi stessi, invece, utilizzare la rispettiva funzione integrata per chiamarla iter
:
>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>
Gli iteratori hanno un __next__
metodo, ma lo chiamiamo con la funzione integrata next
:
>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Quando un iteratore è esaurito, si alza StopIteration
. Questo è il modo in cui Python sa uscire da un for
ciclo, da una comprensione di elenco, da un'espressione di un generatore o da qualsiasi altro contesto iterativo. Una volta che un iteratore si alza StopIteration
, lo solleverà sempre - se vuoi iterare di nuovo, ne hai bisogno di uno nuovo.
>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']
Tornando a dadi
Abbiamo visto dicts iterare in molti contesti. Quello che abbiamo visto è che ogni volta che ripetiamo un dict, otteniamo le chiavi. Torna all'esempio originale:
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
Se cambiamo il nome della variabile, otteniamo ancora le chiavi. Proviamolo:
>>> for each_key in d:
... print(each_key, '=>', d[each_key])
...
x => 1
y => 2
z => 3
Se vogliamo iterare i valori, dobbiamo usare il .values
metodo di dicts, o per entrambi insieme .items
:
>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]
Nell'esempio fornito, sarebbe più efficiente scorrere gli elementi in questo modo:
for a_key, corresponding_value in d.items():
print(a_key, corresponding_value)
Ma per scopi accademici, l'esempio della domanda va bene.