Come funziona l'indicizzazione di un elenco con una tupla?
Domanda
Sto imparando Python e mi sono imbattuto in questo esempio:
W = ((0,1,2),(3,4,5),(0,4,8),(2,4,6))
b = ['a','b','c','d','e','f','g','h','i']
for row in W:
print b[row[0]], b[row[1]], b[row[2]]
che stampa:
a b c
d e f
a e i
c e g
Sto cercando di capire perché!
Capisco che ad esempio la prima volta che la versione estesa è:
print b[(0,1,2)[0]], b[(0,1,2)[1]], b[(0,1,2)[2]]
Ma non capisco come interagisce (0,1,2). Qualcuno può offrire una spiegazione? Grazie.
(questa è una versione abbreviata di alcuni codici per un gioco di tic tac toe e funziona bene, non capisco proprio questa parte)
Soluzione
scorre su una tupla di tuple, ogni riga
è una tupla a tre elementi, quando la stampa accede a tre elementi dell'elenco b
per indice, che è ciò che La tupla row
contiene.
probabilmente, un modo leggermente meno ingombrante per farlo è:
for f, s, t in W:
print b[f], b[s], b[t]
Altri suggerimenti
In fase di scatto, il (0,1,2)
non fa nulla. È una tupla e può essere indicizzata proprio come un elenco, quindi b [(0,1,2) [0]]
diventa b [0]
da ( 0,1,2) [0] == 0
.
Nel primo passaggio Python esegue b [riga [0]]
& # 8594; b [(0,1,2) [0]]
& # 8594; b [0]
& # 8594; 'a'
A proposito, per ottenere più elementi da una sequenza contemporaneamente puoi usare un operatore:
from operator import itemgetter
for row in W:
print itemgetter(*row)(b)
L'indicizzazione di una tupla estrae semplicemente l'ennesimo elemento, proprio come quando si indicizza un array. Cioè, la versione estesa
print b[(0,1,2)[0]], b[(0,1,2)[1]], b[(0,1,2)[2]]
è uguale a
print b[0], b[1], b[2]
IE, il 0 ° elemento della tupla (0, 1, 2) ( (0, 1, 2) [0]
) è 0.
Prova a scrivere i valori di tutte le variabili in ogni passaggio: il risultato che ottieni è giusto.
interazione 1:
- la riga è (0,1,2)
- b [riga [0]], b [riga [1]], b [riga [2]] è b [(0,1,2) [0], (0, 1,2) [1], (0,1,2) [2]], == b [0], b [1], b [2]
interazione 2:
- riga è (3,4,5)
- b [riga [0]], b [riga [1]], b [riga [2]] è b [3], b [4], b [5]
Una shell interattiva Python ti aiuterà a vedere cosa sta succedendo:
In [78]: W = ((0,1,2),(3,4,5),(0,4,8),(2,4,6))
In [79]: b = ['a','b','c','d','e','f','g','h','i']
In [81]: row=W[0] # The first time throught the for-loop, row equals W[0]
In [82]: row
Out[82]: (0, 1, 2)
In [83]: row[0]
Out[83]: 0
In [84]: b[row[0]]
Out[84]: 'a'
In [85]: b[row[1]]
Out[85]: 'b'
In [86]: b[row[2]]
Out[86]: 'c'
per riga in W:
la prima tupla posizionata nella riga
è (0,1,2)
in altre parole, W [0] == (0,1,2)
Therefore, since `row` == (0,1,2), then row[0] == 0
Quindi l'elemento [0] th di b == 'a'
b[0] == 'a'
e così via ...
b[1] == 'b'
b[2] == 'c'