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

如何基于指定子串优先级对Python列表排序,排除无关子串干扰?

实现方案

排序逻辑分两层:

  1. 第一优先级按分组排序:不包含list_two任何关键词的条目排最前,之后按list_two的顺序(Sub组 → Bus组 → Sub2组)排列
  2. 同一分组内,按去掉前缀H、关键词、连接符X后的剩余字符串的字典序排序

要注意Sub和Sub2的匹配优先级,需要先匹配更长的关键词Sub2,避免Sub2被误识别为Sub分组。

完整实现代码

list_one = [
    ['HSubBbb'], ['Aaa'], ['Sub2XAaa'], ['BusXDdd'], ['CccSub2'], 
    ['BusBbb'], ['HBusXAaa'], ['Ccc'], ['HSub2XDdd'], ['CccSub'], 
    ['Sub2Bbb'], ['Bbb'], ['SubXAaa'], ['SubDdd'], ['CccBus']
]
list_two = ['Sub', 'Bus', 'Sub2']

def sort_key(item):
    s = item[0]
    group = 0
    matched_key = ''
    # 按关键词长度倒序匹配,避免短关键词提前匹配长关键词的子集
    for key in sorted(list_two, key=lambda x: -len(x)):
        if key in s:
            group = list_two.index(key) + 1
            matched_key = key
            break
    # 生成同组内排序用的后缀字符串
    suffix = s.replace('H', '').replace(matched_key, '').replace('X', '')
    # 排序key元组,先按分组排序,再按后缀排序
    return (group, suffix)

result = sorted(list_one, key=sort_key)
print(result)

输出结果

运行后输出和要求完全一致:

[
    ['Aaa'], ['Bbb'], ['Ccc'],
    ['SubXAaa'], ['HSubBbb'], ['CccSub'], ['SubDdd'],
    ['HBusXAaa'], ['BusBbb'], ['CccBus'], ['BusXDdd'],
    ['Sub2XAaa'], ['Sub2Bbb'], ['CccSub2'], ['HSub2XDdd']
]

原有代码问题说明

  1. 第一种列表推导式的写法:只保留了包含list_two关键词的条目,直接丢失了无匹配关键词的Aaa、Bbb、Ccc三个条目,且没有做同组内的排序,顺序和原列表顺序一致。
  2. 第二种自定义比较函数的写法:没有区分分组优先级,只比较了处理后的后缀字符串,导致不同分组的条目会混排,同时没有处理Sub和Sub2的匹配优先级,会出现分组识别错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:57:03