2015-05-05 30 views
1

的第一個字母我有這樣的代碼:各自獲得2個字母的單詞的蟒蛇

hand=["TS","AD"] 
test=['--23456789TJQKA'.index(a) for a, b in hand] 
print (test) 

結果是:

[10, 14] 

請問這個片段的工作?它是[a for a,b in list]的一個內置函數,用於獲取Python中列表中每個雙字母單詞的第一個字母?

+2

爲了記錄,雖然此代碼_works_,它不是_good_。將每張卡分成'a,b'而不是僅僅使用'card [0]'(尤其是把它們稱爲'a'和'b'而不是'value'和'suit'),將' dict'會比'list'更好地完成這個工作,並且將它封裝到一個帶有名稱的函數中,而不是將它塞進一個在listcomp的兩半之間的表達式之間分割,這不會有助於可讀性。 – abarnert

+0

在列表理解之前定義''--23456789TJQKA''會阻止它在每次迭代時重新創建(除非python正在做一些時髦的內部優化)。 2次迭代並不是一個問題,但仍值得注意。 –

回答

2

首先,讓我們把代碼放到一個for循環:

hand = ["TS","AD"] 
test = [] 
for a,b in hand: 
    test.append('--23456789TJQKA'.index(a)) 
# note that we didn't use b 

print(test) 

所以這裏發生了什麼?
那麼,hand中的每個元素都是一個具有兩個元素的迭代器。這意味着for a,b in hand會重複遍歷hand中的每個字符串,將第一個字符指定爲a,將第二個字符指定爲b。這是有效地相同:

for mystr in hand: 
    a = mystr[0] 
    b = mystr[1] 
    # or equivalently, a,b = mystr 

下一條是'--23456789TJQKA'.index(a),它簡單地返回的a第一次出現的串中的'--23456789TJQKA'索引。

所以輸出最終被兩個數字的列表 - 每個字符串的第一個字符的索引中hand,即'T''A'

+0

非常感謝您的回覆。所以我可以這樣理解,對於python中的字符串,它可以被視爲一個列表,每個字母都是一個列表值? – Echo

+0

@Echo:是的,你可以這樣想。事實上,字符串被表示爲包括C在內的多種語言的字母數組(* ahem * lists),這就是python本身的實現。列表和字符串之間最直接的區別是字符串是不可變的 - 即,雖然你可以做'myList [2] ='a'',你不能'myString [2] ='a'' – inspectorG4dget

2

這是分裂的手兩個字母串入的手的第一個元素的字母

元組正常列表理解:手的第二個元素

a, b in 'TS' 
# a == 'T' 
# b == 'S' 

'--23456789TJQKA'.index('T') 
# 10 

a, b in 'AD' 
# a == 'A' 
# b == 'D' 

'--23456789TJQKA'.index('A') 
# 14 
0

這裏for a, b in hand部分實際上拆包字符串TSAD。循環變量ab被分配給hand元素。這就好比

(a, b) = 'TS' 

這裏被分配到T和b設置爲S

之後.index方法只是尋找a並返回它的索引。

注意:如果hand包含非兩個字母的單詞,這將不起作用。

0

的代碼有事情做撲克或其他一些紙牌遊戲使用標準的52卡牌。 test將成爲玩家手牌序號列表(「套牌」未保存)。它使用元組解包將手的「等級」放入a中,並將「套裝」放入列表理解中的b

+0

是的,它來自撲克程序。但我只是想知道算法是如何工作的,所以可以用於更通用的用途。 – Echo

+0

Gotcha。我以爲你試圖理解一些你一無所知的代碼。如上所述,該代碼不適合更通用的用途:) –