的第一個字母我有這樣的代碼:各自獲得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個字母的單詞的蟒蛇
hand=["TS","AD"]
test=['--23456789TJQKA'.index(a) for a, b in hand]
print (test)
結果是:
[10, 14]
請問這個片段的工作?它是[a for a,b in list]的一個內置函數,用於獲取Python中列表中每個雙字母單詞的第一個字母?
首先,讓我們把代碼放到一個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'
非常感謝您的回覆。所以我可以這樣理解,對於python中的字符串,它可以被視爲一個列表,每個字母都是一個列表值? – Echo
@Echo:是的,你可以這樣想。事實上,字符串被表示爲包括C在內的多種語言的字母數組(* ahem * lists),這就是python本身的實現。列表和字符串之間最直接的區別是字符串是不可變的 - 即,雖然你可以做'myList [2] ='a'',你不能'myString [2] ='a'' – inspectorG4dget
這是分裂的手兩個字母串入的手的第一個元素的字母
元組正常列表理解:手的第二個元素
a, b in 'TS'
# a == 'T'
# b == 'S'
'--23456789TJQKA'.index('T')
# 10
:
a, b in 'AD'
# a == 'A'
# b == 'D'
'--23456789TJQKA'.index('A')
# 14
這裏for a, b in hand
部分實際上拆包字符串TS
和AD
。循環變量a
和b
被分配給hand
元素。這就好比
(a, b) = 'TS'
這裏被分配到T
和b設置爲S
。
之後.index
方法只是尋找a
並返回它的索引。
注意:如果hand
包含非兩個字母的單詞,這將不起作用。
的代碼有事情做撲克或其他一些紙牌遊戲使用標準的52卡牌。 test
將成爲玩家手牌序號列表(「套牌」未保存)。它使用元組解包將手的「等級」放入a
中,並將「套裝」放入列表理解中的b
。
是的,它來自撲克程序。但我只是想知道算法是如何工作的,所以可以用於更通用的用途。 – Echo
Gotcha。我以爲你試圖理解一些你一無所知的代碼。如上所述,該代碼不適合更通用的用途:) –
爲了記錄,雖然此代碼_works_,它不是_good_。將每張卡分成'a,b'而不是僅僅使用'card [0]'(尤其是把它們稱爲'a'和'b'而不是'value'和'suit'),將' dict'會比'list'更好地完成這個工作,並且將它封裝到一個帶有名稱的函數中,而不是將它塞進一個在listcomp的兩半之間的表達式之間分割,這不會有助於可讀性。 – abarnert
在列表理解之前定義''--23456789TJQKA''會阻止它在每次迭代時重新創建(除非python正在做一些時髦的內部優化)。 2次迭代並不是一個問題,但仍值得注意。 –