如何按姓氏排序元组列表?重复姓氏时按名字排序
按姓氏排序,姓氏相同时按名字排序的实现方法
你当前的写法是直接用完整名字字符串作为排序键,所以会按整个名字的字典序排序,而非先姓氏后名字。要实现需求,只需把排序键改成**(姓氏,名字前缀)**的元组即可,两种方式都能达成目标:
方法一:用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
相关产品推荐
相关产品推荐

