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

如何以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部分:

  1. 剥离end部分:每个元素的end是最后一个下划线后的两位字符,用rsplit('_', 1)分割出前面的prefix+name部分
  2. 计算最长公共前缀:对所有prefix+name字符串取最长公共前缀,这部分会包含prefix和分隔name的下划线
  3. 去除末尾下划线:去掉公共前缀最后的下划线,得到纯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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:45:42