Как работает индексирование списка с помощью кортежа? - PullRequest
4 голосов
/ 23 октября 2009

Я изучаю Python и наткнулся на этот пример:

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]]

который печатает:

a b c

д е ф

a e i

c e g

Я пытаюсь понять, почему!

Я понимаю, что, например, первая версия расширенной версии:

print b[(0,1,2)[0]], b[(0,1,2)[1]], b[(0,1,2)[2]]

Но я не понимаю, как (0,1,2) взаимодействует. Кто-нибудь может предложить объяснение? Спасибо.

(это сокращенная версия кода для игры в крестики-нолики, и она работает хорошо, я просто не понимаю эту часть)

Ответы [ 6 ]

4 голосов
/ 23 октября 2009

итерирует по кортежу кортежей, каждый row является трехэлементным кортежем, при печати он обращается к трем элементам списка b по индексу, что и есть в row кортеже.

вероятно, немного менее загроможденный способ сделать это:

for f, s, t in W:
    print b[f], b[s], b[t]
4 голосов
/ 23 октября 2009

В кадре (0,1,2) ничего не делает. Это кортеж, который можно индексировать, как список, поэтому b[(0,1,2)[0]] становится b[0], начиная с (0,1,2)[0] == 0.

.

На первом шаге Python делает b[row[0]]b[(0,1,2)[0]]b[0]'a'

Кстати, чтобы получить сразу несколько элементов из последовательности, вы можете использовать оператор:

from operator import itemgetter
for row in W:
    print itemgetter(*row)(b)
0 голосов
/ 23 октября 2009

Интерактивная оболочка Python поможет вам увидеть, что происходит:

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'
0 голосов
/ 23 октября 2009

Попробуйте записать значения всех переменных на каждом шаге: полученный результат верен.

взаимодействие 1:

  • строка (0,1,2)
  • b [строка [0]], b [строка [1]], b [строка [2]] - это b [(0,1,2) [0], (0,1 , 2) [1], (0,1,2) [2]], == b [0], b [1], b [2]

взаимодействие 2:

  • строка равна (3,4,5)
  • b [строка [0]], b [строка [1]], b [строка [2]] - это b [3], b [4], b [5]
0 голосов
/ 23 октября 2009

for row in W:

первый кортеж, помещенный в row, равен (0,1,2)

другими словами, W[0] == (0,1,2)

Therefore, since `row` == (0,1,2), then row[0] == 0

Итак, [0]th element of b == 'a'

b[0] == 'a'

и так далее ...

b[1] == 'b'
b[2] == 'c'
0 голосов
/ 23 октября 2009

Индексирование кортежа просто извлекает n-й элемент, так же как и при индексации массива. То есть расширенная версия

print b[(0,1,2)[0]], b[(0,1,2)[1]], b[(0,1,2)[2]]

равно

print b[0], b[1], b[2]

IE, 0-й элемент (0, 1, 2) кортежа ((0, 1, 2)[0]) равен 0.

...