如何识别数组中随机顺序的姓名并按指定格式输出名与姓氏
解决姓名匹配问题:识别名字并对应姓氏
给定两个数组:
datos:里面是顺序随机的姓名,有的是名在前姓在后,有的是姓在前名在后,还有的是两个名字对应一个姓氏datos = ['Lucas Martinez', 'Gonzalez Carmen', 'Garcia Sofia', 'Cristian Ines Perez', 'Jorge Rodriguez']nombres:纯名字的列表nombres = ['Sofia', 'Lucas', 'Cristian', 'Jorge', 'Ines', 'Carmen']
需要把每个名字和对应的姓氏配对,输出"名字 姓氏"的格式,比如:
Lucas Martinez
Carmen Gonzalez
遇到多个名字共用一个姓氏的情况,要拆成两条输出,比如:
Cristian Perez
Ines Perez
你之前的代码只能处理名在前的情况,这里给你一个能覆盖所有场景的解决方案:
完整代码
datos = ['Lucas Martinez', 'Gonzalez Carmen', 'Garcia Sofia', 'Cristian Ines Perez', 'Jorge Rodriguez'] nombres = ['Sofia', 'Lucas', 'Cristian', 'Jorge', 'Ines', 'Carmen'] # 把名字列表转成集合,查找效率比列表高很多 name_set = set(nombres) def match_names_and_last_names(data, names): result = [] for full_name in data: # 把完整姓名拆成单个词 words = full_name.split() # 找出当前这条里所有属于名字的词 found_names = [word for word in words if word in names] # 剩下的词就是姓氏,拼起来(支持多词姓氏,比如"De la Cruz") last_name = ' '.join([word for word in words if word not in names]) # 每个名字对应姓氏,生成目标格式的字符串 for name in found_names: result.append(f"{name} {last_name}") return result # 执行函数并打印结果 for entry in match_names_and_last_names(datos, name_set): print(entry)
代码说明
- 集合优化查找:用集合存名字,是因为集合判断元素是否存在的速度比列表快得多,数据量大的时候优势更明显。
- 拆分与筛选:把每个姓名拆成单个词后,分别筛选出名字和姓氏部分,不管名字在哪个位置都能找到。
- 兼容多词姓氏:如果遇到像
"De la Cruz Maria"这种多词姓氏的情况,代码也能正确把"De la Cruz"作为姓氏配对给名字Maria。 - 处理多名字场景:一条姓名里有多个名字时,每个名字都会和同一个姓氏配对,生成独立的条目。
运行结果
运行代码后会输出:
Lucas Martinez Carmen Gonzalez Sofia Garcia Cristian Perez Ines Perez Jorge Rodriguez
内容的提问来源于stack exchange,提问作者Felipe
相关产品推荐
相关产品推荐

