按字符串多部分排序:基于指定规则排序特定格式字符串列表
按指定顺序对字符串列表排序的解决方案
要实现先按A部分(指定顺序['C1','C2','C3','T1','T2', 'T3'])、再按B部分(指定顺序['3s','6m','1h','8h','24h'])的排序逻辑,我们可以通过自定义排序键来实现,具体步骤如下:
1. 定义优先级映射字典
首先给A和B的每个可选值分配一个优先级数字,数字越小代表排序越靠前,这样排序时就能严格遵循你指定的顺序:
# A部分的优先级:按C1→C2→C3→T1→T2→T3的顺序 a_priority = {'C1': 0, 'C2': 1, 'C3': 2, 'T1': 3, 'T2': 4, 'T3': 5} # B部分的优先级:按3s→6m→1h→8h→24h的顺序 b_priority = {'3s': 0, '6m': 1, '1h': 2, '8h': 3, '24h': 4}
2. 编写排序键提取函数
接下来需要从每个字符串中拆解出A和B部分,然后返回对应的优先级元组(A优先级在前,B优先级在后):
def get_sort_key(s): # 提取A部分:分割字符串后取中间的A值 # 示例:'Vout_C1-3sNP-N' → split('_')得到['Vout', 'C1-3sNP-N'] → 再split('-')取第一个元素'C1' a_part = s.split('_')[1].split('-')[0] # 提取B部分:从分割后的字符串中匹配B的可选值 # 示例:'Vout_C1-3sNP-N' → split('-')得到['Vout_C1', '3sNP-N'] → 遍历B的可选值找到匹配的'3s' b_part = None for b_val in b_priority.keys(): if b_val in s.split('-')[1]: b_part = b_val break # 返回优先级元组,sorted会先按第一个元素排序,再按第二个元素排序 return (a_priority[a_part], b_priority[b_part])
3. 执行排序
最后用Python内置的sorted()函数,传入自定义的排序键函数即可得到结果:
# 示例输入列表 input_list = [ 'Vout_T1-24hNP-N', 'Vout_C1-6mNP-N', 'Vout_C3-3sNP-N', 'Vout_C1-3sNP-N', 'Vout_T2-1hNP-N', 'Vout_C1-24hNP-N', 'Vout_C1-8hNP-N', 'Vout_C1-1hNP-N' ] # 执行排序 sorted_list = sorted(input_list, key=get_sort_key) # 打印结果 for item in sorted_list: print(item)
输出结果:
Vout_C1-3sNP-N Vout_C1-6mNP-N Vout_C1-1hNP-N Vout_C1-8hNP-N Vout_C1-24hNP-N Vout_C3-3sNP-N Vout_T1-24hNP-N Vout_T2-1hNP-N
原理说明
Python的sorted()函数在处理元组类型的排序键时,会先比较元组的第一个元素,当第一个元素相同时,再比较第二个元素,完美匹配了你"先按A顺序、再按B顺序"的排序需求。
内容的提问来源于stack exchange,提问作者Zoe L
相关产品推荐
相关产品推荐

