Python如何将姓名列表转换为首字母缩写 现有代码求排错
问题描述
现有姓名列表,列表内姓名格式为['Surname, Name'](逗号前为姓,逗号后为名),需要将所有姓名转换为仅含首字母的缩写,输出规则为名首字母在前、姓首字母在后,例如占位示例Surname, Name需输出NS。
当前编写的实现代码如下:
list_names = [['Johnson, Sarah'],['Hill, Becky'],['Smith, John']] for name in list_names: for name_string in name: split = name_string.split(", ") join = " ".join(split) initials = "" for n in split: initials += n[0].upper() print(initials)
补充说明:代码拼写错误已修正,原始姓名数据存储在numpy.ndarray结构中,已转换为名为list_names的列表。
问题原因
- 打印逻辑错误:
print(initials)写在遍历拆分结果的循环内部,每拼接一个首字母就会输出一次中间值,单个姓名会产生多行输出,无法得到最终完整缩写 - 首字母顺序错误:字符串按
,拆分后得到的列表第一个元素是姓、第二个元素是名,直接按拆分顺序拼接会得到「姓首字母+名首字母」的结果,和要求的顺序相反 - 存在冗余代码:定义的
join = " ".join(split)变量未被后续逻辑使用,属于无效代码
修正方案
保留原有嵌套循环的易读版本,直接调整顺序和打印位置即可:
list_names = [['Johnson, Sarah'],['Hill, Becky'],['Smith, John']] for name in list_names: for name_string in name: # 拆分时直接接收姓和名两个变量 surname, first_name = name_string.split(", ") # 按「名首字母+姓首字母」的顺序拼接,统一转大写 initials = first_name[0].upper() + surname[0].upper() print(initials)
运行后输出结果为:
SJ BH JS
如果需要批量收集所有结果,可以新增一个结果列表存储,也可以用列表推导式简化写法:
list_names = [['Johnson, Sarah'],['Hill, Becky'],['Smith, John']] initials_result = [fn[0].upper() + sn[0].upper() for sn, fn in [item[0].split(", ") for item in list_names]] print(initials_result) # 输出 ['SJ', 'BH', 'JS']
内容的提问来源于stack exchange,提问作者Posey
相关产品推荐
相关产品推荐

