升序排序方法剖析"/>
《流畅的python》 纸牌案例 升序排序方法剖析
suit_values = 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_values) + suit_values[card.suit]for card in sorted(deck, key = spades_value):print card
实话实说,一开始我看到这段代码的时候是懵的。在另一位大佬的帮助下,我总算明白了。
下面是对这段代码的剖析,如有纰漏,恭迎各位斧正!
我们从函数内部开始看:
第一句:
rank_value = FrenchDeck.ranks.index(card.rank)
在实例deck里面,每一个元素都是一个tuple,我们获取这个tuple的属性rank,即得到了扑克牌的点数。然后用index函数得到了点数在FrenchDeck.ranks中对应的索引,并将其作为扑克牌排序的依据之一赋值给rank_value。这也便是上面这段代码所实现的功能。
第二句:
return rank_value * len(suit_values) + suit_values[card.suit]
这个排序依据的含义:
suit_values[card.suit]对应的就是花色在suit_values中对应的值。len(suit_values)其实就是4。因为rank的优先级是高于suit的,所以4*rank_value+suit_value的确是我们想要的值,我们也就可以实现对扑克牌的排序了,但是要注意对JQKA的处理。
让我们走出函数,到输出句:
for card in sorted(deck, key = spades_value):print card
这句中的sorted函数是python自带的排序函数,它一共有三个参数,第一个是要排序的对象,key是排序的参照物,还有一个是reverse,一个bool值,当它为True时倒序排列,有了这些知识我们就能理解这个算法了,不得不说,这个算法还是很牛的!
更多推荐
《流畅的python》 纸牌案例 升序排序方法剖析
发布评论