如何基于指定子串优先级对Python列表排序,排除无关子串干扰?
实现方案
排序逻辑分两层:
- 第一优先级按分组排序:不包含
list_two任何关键词的条目排最前,之后按list_two的顺序(Sub组 → Bus组 → Sub2组)排列 - 同一分组内,按去掉前缀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'] ]
原有代码问题说明
- 第一种列表推导式的写法:只保留了包含
list_two关键词的条目,直接丢失了无匹配关键词的Aaa、Bbb、Ccc三个条目,且没有做同组内的排序,顺序和原列表顺序一致。 - 第二种自定义比较函数的写法:没有区分分组优先级,只比较了处理后的后缀字符串,导致不同分组的条目会混排,同时没有处理
Sub和Sub2的匹配优先级,会出现分组识别错误。
内容的提问来源于stack exchange,提问作者Mauricio
相关产品推荐
相关产品推荐

