Python中sorted函数key参数使用异常:扑克牌排序未生效排查
问题分析与解决
咱们先从你最开始的sortYo()函数问题说起:
你写的sorted(L2, key = sortYo())这里犯了一个典型的错误——你把sortYo()的执行结果传给了key参数,而不是传递函数本身。而且你的sortYo函数内部只定义了字典,完全没有return语句,所以它默认返回None。这就导致所有牌面的排序key都是None,sorted会认为所有元素的优先级完全相同,自然不会改变原列表的顺序。
正确的思路是:sorted的key参数需要接收一个能接收单个元素、并返回对应排序权重的函数,而不是一个固定值。
再看你补充的代码,你改成了用lambda x: myDict.get(x,11)作为key,运行结果看起来和原列表一致,但这其实是因为你测试用的L2本身已经是按数值从小到大排列的了(['A', '5', '6', '7', 'K'],对应权重1、5、6、7、10)。如果用你最开始的L2 = ['5', '6', '7', 'A', 'K']来测试这个lambda写法,排序结果就会变成['A', '5', '6', '7', 'K'],完全符合你的预期。
两种正确的写法示例
方式1:修复你的自定义函数
把sortYo改成能返回牌面对应权重的函数,调用时直接传函数名(不要加括号!):
def get_rank_weight(card): rank_map = {'A': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'T': 10, 'J': 10, 'Q': 10, 'K': 10} return rank_map.get(card, 11) # 用get处理无效牌面,默认权重设为11 # 调用时只传函数名,让sorted自动把每个元素传给它 L4 = sorted(L2, key=get_rank_weight)
方式2:用lambda表达式(你补充的写法本身是对的)
如果用你最开始的无序列表测试:
rank_map = {'A': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'T': 10, 'J': 10, 'Q': 10, 'K': 10} L2 = ['5', '6', '7', 'A', 'K'] L4 = sorted(L2, key=lambda x: rank_map.get(x, 11)) print(L4) # 输出: ['A', '5', '6', '7', 'K']
就能得到你想要的排序结果。
额外小提示
如果你的场景需要把A当作最大的牌(比如德州扑克规则里A可以算14),可以调整权重映射,或者在排序时做特殊判断,这个就看你具体的业务需求啦。
内容的提问来源于stack exchange,提问作者Coder117
相关产品推荐
相关产品推荐

