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

如何按姓氏排序元组列表?重复姓氏时按名字排序

按姓氏排序,姓氏相同时按名字排序的实现方法

你当前的写法是直接用完整名字字符串作为排序键,所以会按整个名字的字典序排序,而非先姓氏后名字。要实现需求,只需把排序键改成**(姓氏,名字前缀)**的元组即可,两种方式都能达成目标:

方法一:用Lambda表达式实现

直接在lambda里拆分名字,返回以姓氏为第一排序项、名字前缀为第二排序项的元组:

names = [
    (123, 'Active', 'Michael Wilson Blessing'),
    (456, 'Active', 'Tim Weaver Beadle'),
    (789, 'Active', 'Lois Alan Beadle'),
]

sorted_names = sorted(names, key=lambda x: (x[2].split()[-1], ' '.join(x[2].split()[:-1])))

逻辑说明:

  • x[2].split() 将完整名字按空格拆分成列表,比如'Lois Alan Beadle'会变成['Lois', 'Alan', 'Beadle']
  • split()[-1] 取最后一个元素作为姓氏
  • ' '.join(split()[:-1]) 将除姓氏外的部分重新拼成字符串,作为名字前缀用于二次排序

方法二:用自定义函数实现

如果后续需要扩展逻辑(比如处理带连字符的姓氏、特殊格式的中间名等),自定义函数的可读性更强:

def name_sort_key(item):
    full_name = item[2]
    name_parts = full_name.split()
    last_name = name_parts[-1]
    first_middle_names = ' '.join(name_parts[:-1])
    return (last_name, first_middle_names)

sorted_names = sorted(names, key=name_sort_key)

两种方式最终的排序结果一致:先按姓氏字典序排列,姓氏相同时按名字前缀的字典序排列。针对你给出的示例,排序后顺序为:
(789, 'Active', 'Lois Alan Beadle') → (456, 'Active', 'Tim Weaver Beadle') → (123, 'Active', 'Michael Wilson Blessing')

内容的提问来源于stack exchange,提问作者ZapRowsdower

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:05:31