如何使用元组索引列表?

4

我正在学习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

d e f

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
简而言之,(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)

4

它遍历元组的元组,每个row都是一个三元素元组,打印时通过索引访问b列表的三个元素,这也是row元组包含的内容。

也许,一种稍微简洁的方法是:

for f, s, t in W:
    print b[f], b[s], b[t]

1
我从另一篇帖子中找到了答案,但我喜欢你的帖子,因为你提出的方法更加清晰。谢谢。 - Steve

0

对元组进行索引操作只是提取第n个元素,就像对数组进行索引操作一样。也就是说,扩展版本如下:

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

等于

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

例如,元组(0、1、2)的第0个元素((0, 1, 2)[0])是0。


这很有帮助。我卡在了 b[...] 部分,没有意识到 (0,1,2)[0] 部分本身就是一个操作 - 即对元组进行索引。然后我在 shell 中尝试了不同的变化,看到了返回的结果,然后我明白了!谢谢。 - Steve

0

for row in W:

row 中的第一个元组是 (0,1,2)

换句话说,W[0] == (0,1,2)

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

所以b的[0]元素等于'a'。
b[0] == 'a'

等等...

b[1] == 'b'
b[2] == 'c'

这很令人困惑:"row[0] == (0,1,2) 因此,row[0] == 0" - ndim

0
一个Python交互式shell将帮助您了解正在发生的事情:
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

尝试在每个步骤中写下所有变量的值:你得到的结果是正确的。

交互1:

  • row 是 (0,1,2)
  • b[row[0]], b[row[1]], b[row[2]] 是 b[(0,1,2)[0], (0,1,2)[1], (0,1,2)[2]],等于 b[0]、b[1]、b[2]

交互2:

  • row 是 (3,4,5)
  • b[row[0]], b[row[1]], b[row[2]] 是 b[3]、b[4]、b[5]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接