求助:Python中使用lambda对(name,score)元组列表按指定规则排序
元组列表多规则排序解决方案
你的问题出在reverse=True会同时反转整个排序键的所有规则,导致分数降序的同时,同分数的姓名也被降序排列,不符合需求。以下是两种可行的解决方法:
方法一:调整排序键的数值方向
通过对分数取负数,让默认的升序排序等价于分数的降序,同时保持姓名的升序规则:
averages = [('Ryan',7), ('Brian',11), ('Aiden',11), ('Jack',7), ('Mia',20)] averages.sort(key=lambda x: (-x[1], x[0])) print(averages)
输出结果:
[('Mia', 20), ('Aiden', 11), ('Brian', 11), ('Jack', 7), ('Ryan', 7)]
方法二:利用稳定排序分两次排序
Python的排序是稳定排序(相同键值的元素排序后相对位置不变),可以先按次要规则(姓名升序)排序,再按主要规则(分数降序)排序:
from operator import itemgetter averages = [('Ryan',7), ('Brian',11), ('Aiden',11), ('Jack',7), ('Mia',20)] # 先按姓名升序排序 averages.sort(key=itemgetter(0)) # 再按分数降序排序,稳定排序会保留同分数的姓名顺序 averages.sort(key=itemgetter(1), reverse=True) print(averages)
输出结果与方法一一致。
原代码问题解析
你之前的代码averages.sort(key=lambda x: (x[1],x[0]),reverse=True)中,reverse=True会对整个元组(x[1], x[0])的排序规则反转:原本默认是先按x[1]升序、再按x[0]升序,反转后变成先按x[1]降序、再按x[0]降序,这就导致同分数的姓名呈现倒序,和预期不符。
内容的提问来源于stack exchange,提问作者parsabr
相关产品推荐
相关产品推荐

