Python算法实现:从混合姓名列表中提取完整姓名
解决混合姓名列表的完整姓名提取问题
没问题,我来帮你实现这个符合要求的Python算法!先明确下需求的核心:我们要从混合了单个名/姓和完整姓名的列表里,最终输出包含所有单个名/姓的完整姓名,如果某个单个名/姓找不到对应的完整姓名,就保留它本身,同时要避免重复条目。
实现思路
- 先把输入列表拆成两类:带空格的完整姓名,和不带空格的单个姓名(先去重,避免重复处理同一个名字)。
- 为每个单个姓名匹配所有包含它的完整姓名(不管是作为名还是姓)。
- 构建结果集:把匹配到的完整姓名加进去,没有匹配的单个姓名直接保留。
- 最后去重,保证结果里没有重复条目。
完整代码实现
def extract_full_names(name_list): # 预处理:拆分完整姓名和单个姓名,同时清理前后空格、去重单个姓名 full_names = [name.strip() for name in name_list if ' ' in name.strip()] single_names = list({name.strip() for name in name_list if ' ' not in name.strip()}) # 建立单个姓名到对应完整姓名的映射 name_mapping = {} for single_name in single_names: matching_full_names = [] for full_name in full_names: # 检查单个姓名是否是完整姓名的组成部分(名或姓) name_parts = full_name.split() if single_name in name_parts: matching_full_names.append(full_name) name_mapping[single_name] = matching_full_names # 组装最终结果 result = [] for single, matches in name_mapping.items(): if matches: # 有匹配的完整姓名,加入结果 result.extend(matches) else: # 没有匹配,保留单个姓名 result.append(single) # 去重并保留首次出现的顺序(Python 3.7+ 支持字典有序) result = list(dict.fromkeys(result)) return result # 测试示例列表 sample_list = ['John May', ' May', 'John', 'John Smith','Jack', 'John','May Smith', 'Sandra', 'Tim John','Simon', 'Tim Sandra', 'Sandra Smith'] print(extract_full_names(sample_list))
代码说明
- 预处理步骤:用
strip()清理掉姓名前后的空格(比如示例里的' May'会变成'May'),避免因为空格导致匹配失败;单个姓名用集合去重,避免重复处理同一个名字。 - 匹配逻辑:遍历每个单个姓名,检查它是否出现在某个完整姓名的拆分部分里(不管是名还是姓),把所有匹配的完整姓名收集起来。
- 结果组装:对于每个单个姓名,有匹配就加完整姓名,没有就保留原单个姓名;最后用
dict.fromkeys()去重,同时保持元素第一次出现的顺序。
测试输出
运行上面的代码,你会得到:
['John May', 'May Smith', 'John Smith', 'Tim John', 'Jack', 'Tim Sandra', 'Sandra Smith', 'Simon']
完全符合规则:所有单个名/姓都找到了对应的完整姓名,Jack和Simon没有匹配到完整姓名,所以被保留下来,并且没有重复条目。
内容的提问来源于stack exchange,提问作者jax
相关产品推荐
相关产品推荐

