如何将姓名列表按姓氏首字母分组为嵌套列表并按名字排序?
实现姓氏首字母分组+组内名字排序的方案
嘿,这个需求其实分两步就能轻松搞定:先把每个姓名拆成名和姓,再按姓氏首字母分组并在组内排序。我给你写个Python的具体实现,细节都给你理清楚:
步骤拆解与代码实现
1. 先处理姓名拆分与分组收集
首先我们需要把每个完整姓名拆成「名字」和「姓氏」,同时用一个字典来按姓氏首字母归类。这里用collections.defaultdict能省不少判断的功夫:
from collections import defaultdict # 你的原始姓名列表 groups = ['James Scott','Mary Robinson','Willie Hayes','Katherine Davis','Chad Butler','Josephine Clark','Zachary Jack'] # 初始化一个按姓氏首字母分组的字典 name_dict = defaultdict(list) for full_name in groups: # 拆分姓名,兼容带中间名的情况(比如"Mary Ann Robinson") name_parts = full_name.split() first_name = ' '.join(name_parts[:-1]) # 名字部分(含中间名) last_name = name_parts[-1] # 姓氏部分 # 用姓氏首字母的大写作为字典的键 last_initial = last_name[0].upper() # 把(名字, 姓氏)元组存入对应分组 name_dict[last_initial].append( (first_name, last_name) )
2. 按A-Z顺序生成最终嵌套列表,组内按名字排序
接下来我们按字母表顺序遍历A到Z,把每个首字母对应的分组拿出来,同时对组内的姓名按名字排序:
final_result = [] # 遍历A-Z的每个字母,保证分组顺序严格按字母表来 for char in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ': # 获取当前字母对应的分组,没有的话返回空列表 current_group = name_dict.get(char, []) # 按名字排序,再拼接回完整姓名 sorted_group = [f"{fname} {lname}" for fname, lname in sorted(current_group, key=lambda x: x[0])] # 如果你不需要空分组,可以加个判断:if sorted_group: final_result.append(sorted_group) final_result.append(sorted_group) # 打印看看结果 for idx, group in enumerate(final_result): print(f"{chr(ord('A') + idx)}组: {group}")
额外说明
- 拆分姓名的方式兼容带中间名的情况,比如"John Michael Doe"会被正确拆分为名字"John Michael",姓氏"Doe";
- 最终的分组是严格按A-Z顺序排列的,即使某个字母没有对应的姓氏,也会保留一个空列表(如果不需要空组,去掉注释里的判断即可);
- 组内排序是按名字的字母顺序来的,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Boi_Dream
相关产品推荐
相关产品推荐

