suit_value = dict(spades=3, hearts=2, diamonds=1, clubs=0)
def spades_high(card):
rank_value = FrenchDeck.ranks.index(card.rank)
return rank_value * len(suit_value) + suit_value[card.suit]
注:此代码第一优先级排序为纸牌的数字,第二优先级为纸牌的花色
第一句得出的suit_value是一个字典,为下面的第二优先级排序制定优先级。
第二句
rank_value = FrenchDeck.ranks.index(card.rank)
问题:输出的是什么?
rank_value是将FrenchDeck类中rank得下标。比如下面得例子:
a = [1,2,3]
print(a.index(1))
a 就类似于 FrenchDeck.ranks,1就类似于card.rank,而输出1的下标就是0
第三句
return rank_value * len(suit_value) + suit_value[card.suit]
问题:rank_value为什么要去乘以len(suit_value),也就是为什么要去乘以4?
rank_value是一个下标,下标和下标之间差距只有1,且前面说第一优先级是纸牌的数字,但是却有第二优先级这个影响单位在,所以我们需要拉开下标之间的差距,从而降低第二优先级对排序的影响,如果相乘的数字比较小就会出现下面这个排序混乱的情况,例如乘以2:
Card(rank='3', suit='clubs')
Card(rank='2', suit='spades')
按照第一优先级的排序,rank=“2”应是比rank=“3”要小的,但是第二优先级的影响,导致
1(3的下标是1) * 2+“club”(0)< 0(2的下标是0)*2+“spades”(3)
所以需要rank_value乘以的数字越大,那么第二优先级相加的影响就越小乃至于无。
for card in sorted(deck,key=spades_high):
print(card)
这个循环就是对deck进行排序了,遵从的规则就是spades_high。