如何生成保留至少一个全名的首字母缩写姓名组合?
用itertools实现姓名组合生成
核心思路是通过生成「保留/替换」的掩码组合,覆盖所有符合要求的姓名变体,具体实现步骤如下:
实现代码
import itertools def generate_name_variants(full_name): name_parts = full_name.split() # 生成所有可能的保留(True)/替换为首字母(False)的组合 mask_combinations = itertools.product([True, False], repeat=len(name_parts)) variants = [] for mask in mask_combinations: # 跳过所有部分都替换为首字母的情况(示例未包含此类) if not any(mask): continue # 根据掩码生成对应姓名片段 current_variant = [] for part, keep_full in zip(name_parts, mask): current_variant.append(part if keep_full else part[0]) variants.append(' '.join(current_variant)) return variants
代码说明
- 拆分姓名:把输入的姓名字符串按空格拆分成独立片段列表,比如
"Richard Anthony David"会拆成["Richard", "Anthony", "David"]。 - 生成掩码组合:用
itertools.product生成所有True/False组合,每个组合对应一组「是否保留完整姓名」的规则,比如(True, False, True)表示保留第一、第三个完整姓名,第二个替换为首字母。 - 过滤无效组合:跳过全为
False的掩码(即所有部分都替换为首字母的情况,示例未包含此类输出)。 - 生成变体:遍历每个有效掩码,按规则拼接姓名字符串,最后收集所有结果。
测试验证
- 输入双部分姓名:
输出:print(generate_name_variants("Richard David"))['Richard David', 'Richard D', 'R David'] - 输入三部分姓名:
输出:print(generate_name_variants("Richard Anthony David"))
完全匹配给出的示例结果。['Richard Anthony David', 'Richard Anthony D', 'Richard A David', 'R Anthony David', 'Richard A D', 'R Anthony D', 'R A David']
内容的提问来源于stack exchange,提问作者Jossy
相关产品推荐
相关产品推荐

