2009-10-23 29 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'