Python中如何用lambda与字典键实现扑克牌手牌自定义排序
带自定义优先级的扑克牌多维度排序实现
Python内置的sort()方法虽然只接受一个key参数,但完全支持多规则排序——key函数可以返回元组类型,排序时会自动按元组元素的先后顺序逐位比较优先级,第一位规则优先级最高,第一位相等时才会比较第二位,刚好适配你「先排牌面等级、再排花色」的需求。
你之前直接用lambda x: x[0]排序失效的原因很简单:这种写法是直接拿牌面字符的ASCII码值做比较,不会走你自定义的等级权重规则,自然出不了A>K>Q>J的排序结果。
具体实现代码
# 自定义权重配置 rankPriority = {'A': 1, 'K': 2, 'Q': 3, 'J': 4} suitPriority = {'s': 1, 'h': 2, 'c': 3, 'd': 4} # 待排序手牌 hand = ['Ks','Qs','As','Ah','Ac','Jh','Qd','Kc','Ad'] # key返回(牌面权重, 花色权重)的元组,依次匹配排序规则 hand.sort(key=lambda card: (rankPriority[card[0]], suitPriority[card[1]])) # 排序后结果:['As', 'Ah', 'Ac', 'Ad', 'Ks', 'Kc', 'Qs', 'Qd', 'Jh']
逻辑说明
- 每张牌的字符串结构固定为
牌面+花色,用card[0]取牌面字符、card[1]取花色字符,分别匹配提前定义好的优先级权重 - 元组比较的特性天然支持多级排序,不需要额外嵌套排序逻辑,性能和写法都最优
- 如果后续需要扩展牌面(比如加入10、9、8等牌值),只需要往
rankPriority字典里补充对应的键值权重即可,排序逻辑不需要改动
内容的提问来源于stack exchange,提问作者eddie kan
相关产品推荐
相关产品推荐

