如何对元组列表实现条件排序?先按次元素再按首元素字母序
多条件排序元组列表的正确实现
需求说明
需要对以下元组列表按规则排序:
- 优先按元组的第二个元素(数字)升序排列
- 当第二个元素相同时,按元组的第一个元素(字符串)字母序升序排列
给定的元组列表:
patient_list: list[tuple] = [("Johnson", 9), ("Smith", 2), ("Perry", 4), ("Allison", 8), ("Bradley", 1), ("Tucker", 9)]
现有代码的问题
你尝试的两种方法都无法满足需求:
第一种代码:仅按元组第二个元素排序,未处理相同数字时的姓名字母序逻辑,比如
("Johnson",9)和("Tucker",9)会保留原列表中的顺序,不符合字母序要求。def sort(patient_list: list[tuple]) -> list[tuple]: patient_list = sorted(patient_list, key=lambda y: y[1]) print(patient_list) sort(patient_list)第二种代码:两次独立排序的逻辑错误,第二次按数字排序会覆盖第一次按姓名排序的结果,无法保证相同数字的元组按姓名字母序排列。
def sort(patient_list: list[tuple]) -> list[tuple]: patient_list = sorted(patient_list, key=lambda t: t[0]) patient_list = sorted(patient_list, key=lambda y: y[1]) print(patient_list) sort(patient_list)
正确实现方法
给sorted函数的key参数指定复合排序键——返回一个包含两个元素的元组,先按原元组的第二个元素,再按第一个元素。sorted会先比较数字部分,数字相等时自动比较姓名的字母序,完全匹配需求。
完整代码:
def sort_patients(patient_list: list[tuple]) -> list[tuple]: """按规则排序患者列表:优先数字升序,数字相同时姓名字母序升序""" sorted_list = sorted(patient_list, key=lambda x: (x[1], x[0])) print(sorted_list) return sorted_list patient_list: list[tuple] = [("Johnson", 9), ("Smith", 2), ("Perry", 4), ("Allison", 8), ("Bradley", 1), ("Tucker", 9)] sort_patients(patient_list)
执行后输出结果:
[('Bradley', 1), ('Smith', 2), ('Perry', 4), ('Allison', 8), ('Johnson', 9), ('Tucker', 9)]
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

