2009-10-23 31 views
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]] 

它打印:

ABC

高清

AEI

CEG

我想弄清楚为什么!

我得到的,例如第一次直通的扩展版本是:

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

但我不明白的(0,1,2)是如何相互作用的。任何人都可以提供解释吗?谢谢。

(这是一个井字游戏中的一些代码的简化版本,而且它运作良好,我只是不明白这部分)

回答

4

它迭代通过元组的元组,每个row是一个三元组元组,在打印时,它通过索引来访问列表中的三个元素,这就是row元组包含的元素。

可能,稍微更简洁的方式来做到这一点是:

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

我从另一篇文章中找到了它,但是我喜欢你的文章,因为你的建议方式更清晰一些。谢谢。 – Steve 2009-10-23 16:58:36

4

在镜头中,(0,1,2)什么都不做。它是一个元组,可以像列表一样进行索引,因此b[(0,1,2)[0]](0,1,2)[0] == 0变为b[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

索引一个元组只提取第n个元素,就像索引数组时一样。也就是说,为了

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

IE中,(0,1,2)元组((0, 1, 2)[0])第0个元素的扩展版本

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

等于为0

+0

这帮助。我被困在b部分,并且错过了(0,1,2)[0]部分本身就是一个操作 - 即索引一个元组。然后,我在壳体中尝试了不同的变化,看到了什么被返回,然后我明白了!谢谢。 – Steve 2009-10-23 16:56:39

0

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

这令人困惑:“'row [0] ==(0,1,2)'因此,'row [0] == 0'” – ndim 2009-10-23 16:49:06

+0

当然是。修复了明显的错误。 – gahooa 2009-10-24 16:13:29

0

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

相互作用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 [row [0]],b [row [1]],b [row [2]]是b [3],b [4] 5]
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'