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

Python如何不转换DataFrame直接修改列表内姓名格式

Python列表内姓名字段格式转换方案

需求说明

需要直接对列表存储的姓名做格式转换,全程保持list类型,无需转换为DataFrame:

  • 原格式:Last, First [中间名/前后缀](姓在前,逗号分隔,后面跟名和可选的中间名、缩写、前后缀)
  • 目标格式:First Last(名在前,姓在后,丢弃所有中间名、姓名前后缀)

测试数据

输入列表

current_list = ["Sanchez, Rick", "Rick, Killer", "Smith, Morty S O L", "Smith, Summer J", "Clockberg Jr., Revolio", "van Womg, Peter", "Lynn-Marie, Sam", "Parker II, Peter"]

期望输出

transformed_list = ["Rick Sanchez", "Killer Rick", "Morty Smith", "Summer Smith", "Revolio Clockberg", "Peter Womg", "Sam Lynn-Marie", "Peter Parker"]

实现逻辑

列表类型没有pandas Series的apply方法,直接用for循环/列表推导式逐元素处理即可,性能比转DataFrame更高,也无需依赖pandas库。
注意直接对全字符串按空格拆分的写法无法正确处理带空格的复姓、带前后缀的姓名,因此需要先按第一个逗号拆分姓段和名段,再分别清洗:

  1. 名段处理:取逗号后第一个空格前的内容作为正式名,后面所有中间名、缩写直接丢弃
  2. 姓段处理:过滤掉所有无效段,包括带点的世代后缀(Jr.、Sr.等)、全大写的短串(罗马数字II/III、单个首字母缩写等)、全小写开头的姓名前缀(van、der等),剩下的内容就是核心姓氏

完整代码

def is_valid_last_segment(seg: str) -> bool:
    """判断姓的分段是否为核心姓氏部分,过滤前后缀、缩写"""
    seg = seg.strip()
    # 过滤规则:带点的后缀、全大写且长度<=3的缩写/罗马数字、全小写开头的前缀
    if '.' in seg or (seg.isupper() and len(seg) <= 3) or seg.islower():
        return False
    return True

transformed_list = []
for name_str in current_list:
    # 只按第一个逗号拆分,避免拆分姓内部的空格
    last_raw, first_raw = name_str.split(',', 1)
    # 提取正式名:取逗号后第一个词
    first_name = first_raw.strip().split()[0]
    # 清洗姓氏:过滤无效分段后拼接
    last_name = ' '.join([seg for seg in last_raw.strip().split() if is_valid_last_segment(seg)])
    # 拼接成目标格式
    transformed_list.append(f"{first_name} {last_name}")

运行后得到的transformed_list和期望输出完全一致。如果需要适配更多特殊姓名格式,只要调整is_valid_last_segment里的过滤规则即可。如果偏好更简洁的lambda风格写法,也可以用map配合列表推导实现,逻辑完全一致。


内容的提问来源于stack exchange,提问作者davida28

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:57:29