You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成保留至少一个全名的首字母缩写姓名组合?

用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

代码说明

  1. 拆分姓名:把输入的姓名字符串按空格拆分成独立片段列表,比如 "Richard Anthony David" 会拆成 ["Richard", "Anthony", "David"]。
  2. 生成掩码组合:用itertools.product生成所有True/False组合,每个组合对应一组「是否保留完整姓名」的规则,比如(True, False, True)表示保留第一、第三个完整姓名,第二个替换为首字母。
  3. 过滤无效组合:跳过全为False的掩码(即所有部分都替换为首字母的情况,示例未包含此类输出)。
  4. 生成变体:遍历每个有效掩码,按规则拼接姓名字符串,最后收集所有结果。

测试验证

  • 输入双部分姓名:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:24:51