Επανάληψη σε λεξικά χρησιμοποιώντας βρόχους 'for'

Με προβληματίζει λίγο ο παρακάτω κώδικας:

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

Αυτό που δεν καταλαβαίνω είναι το τμήμα "κλειδί". Πώς αναγνωρίζει η Python ότι χρειάζεται να διαβάσει μόνο το κλειδί από το λεξικό; Είναι η λέξη "κλειδί" μια ειδική λέξη στην Python; Ή είναι απλά μια μεταβλητή;

Λύση

Το key είναι απλώς ένα όνομα μεταβλητής.

for key in d:

θα κάνει απλά βρόχο πάνω από τα κλειδιά του λεξικού, αντί για τα κλειδιά και τις τιμές. Για να κάνετε βρόχο και στα δύο κλειδιά και στις δύο τιμές μπορείτε να χρησιμοποιήσετε τα εξής:

Για την Python 2.x:

for key, value in d.iteritems():

Για Python 3.x:

for key, value in d.items():

Για να το δοκιμάσετε μόνοι σας, αλλάξτε τη λέξη key σε poop.

Για την Python 3.x, η iteritems() έχει αντικατασταθεί με την απλή items(), η οποία επιστρέφει μια προβολή που μοιάζει με σύνολο και υποστηρίζεται από την dict, όπως η iteritems() αλλά ακόμα καλύτερα. Αυτό είναι επίσης διαθέσιμο στην 2.7 ως viewitems().

Η λειτουργία items() θα λειτουργεί και για το 2 και για το 3, αλλά στο 2 θα επιστρέφει μια λίστα με τα ζεύγη (key, value) του λεξικού, τα οποία δεν θα αντικατοπτρίζουν τις αλλαγές στο dict που συμβαίνουν μετά την κλήση της items(). Αν θέλετε τη συμπεριφορά της 2.x στην 3.x, μπορείτε να καλέσετε την list(d.items()).

Σχόλια (10)

Όταν κάνετε επανάληψη σε λεξικά χρησιμοποιώντας το συντακτικό for .. in .., πάντα γίνεται επανάληψη στα κλειδιά (οι τιμές είναι προσβάσιμες χρησιμοποιώντας το dictionary[key]).

Για να κάνετε επανάληψη σε ζεύγη κλειδιών-τιμών, στην Python 2 χρησιμοποιήστε for k,v in s.iteritems(), και στην Python 3 for k,v in s.items().

Σχόλια (1)

Αυτό είναι ένα πολύ συνηθισμένο ιδίωμα βρόχου. Το in είναι ένας τελεστής. Για το πότε πρέπει να χρησιμοποιείτε το for key in dict και πότε πρέπει να είναι for key in dict.keys() δείτε David Goodger's Idiomatic Python article (αρχειοθετημένο αντίγραφο).

Σχόλια (1)