You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对元组列表实现条件排序?先按次元素再按首元素字母序

多条件排序元组列表的正确实现

需求说明

需要对以下元组列表按规则排序:

  • 优先按元组的第二个元素(数字)升序排列
  • 当第二个元素相同时,按元组的第一个元素(字符串)字母序升序排列

给定的元组列表:

patient_list: list[tuple] = [("Johnson", 9), ("Smith", 2), ("Perry", 4), ("Allison", 8), ("Bradley", 1), ("Tucker", 9)]

现有代码的问题

你尝试的两种方法都无法满足需求:

  1. 第一种代码:仅按元组第二个元素排序,未处理相同数字时的姓名字母序逻辑,比如("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)
    
  2. 第二种代码:两次独立排序的逻辑错误,第二次按数字排序会覆盖第一次按姓名排序的结果,无法保证相同数字的元组按姓名字母序排列。

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:00:58