如何以Pythonic方式获取Python列表元素的共同前缀?
Pythonic方法提取列表元素的共同前缀(符合指定规则)
给定一个字符串列表,每个元素遵循以下结构:
- 由
prefix、name、end三部分组成,各部分以下划线_分隔 - 每部分长度不固定,
prefix和name内部也可包含下划线 end为两位字符串,格式是首字符A加一位0-9的数字- 所有元素的
name唯一,prefix相同但未知
需要实现一个函数提取这个共同的prefix。
示例:
list1 = ['4_AR_P3_A0', '4_BCML_A0', '4_PA_RU_LR_A0', '4_Routes_A0'] get_prefix(list1) # 正确输出应为 '4'(原示例笔误为'2') list2 = ['MPL_TER_LA_Desse_A1', 'MPL_TER_LA_Magnit_Mach_A0', 'MPL_TER_LA_LR_A6', 'MPL_TER_LA_Routes_A0'] get_prefix(list2) # 输出: 'MPL_TER_LA'
最优Pythonic实现思路
利用Python标准库的os.path.commonprefix快速计算最长公共前缀,结合字符串分割处理掉末尾的end部分:
- 剥离end部分:每个元素的
end是最后一个下划线后的两位字符,用rsplit('_', 1)分割出前面的prefix+name部分 - 计算最长公共前缀:对所有
prefix+name字符串取最长公共前缀,这部分会包含prefix和分隔name的下划线 - 去除末尾下划线:去掉公共前缀最后的下划线,得到纯
prefix
代码实现
import os def get_prefix(str_list): if not str_list: return "" # 剥离每个元素的end部分,得到prefix+name的列表 prefix_name_parts = [s.rsplit('_', 1)[0] for s in str_list] # 获取最长公共前缀 common_with_sep = os.path.commonprefix(prefix_name_parts) # 去掉末尾的下划线,返回最终prefix return common_with_sep.rstrip('_') # 测试示例 list1 = ['4_AR_P3_A0', '4_BCML_A0', '4_PA_RU_LR_A0', '4_Routes_A0'] print(get_prefix(list1)) # 输出: '4' list2 = ['MPL_TER_LA_Desse_A1', 'MPL_TER_LA_Magnit_Mach_A0', 'MPL_TER_LA_LR_A6', 'MPL_TER_LA_Routes_A0'] print(get_prefix(list2)) # 输出: 'MPL_TER_LA'
为什么这是最优的?
- 简洁高效:
os.path.commonprefix是C实现的底层函数,处理字符串前缀的效率远高于纯Python循环 - 符合规则:精准利用
end的固定格式剥离无关部分,结合name唯一的特性,确保提取的是真正的公共prefix - 鲁棒性:自动处理
prefix包含下划线的情况,无需提前知道prefix的长度
内容的提问来源于stack exchange,提问作者Matt_Geo
相关产品推荐
相关产品推荐

