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

基于主列表对含枚举后缀的列表元素进行排序

自定义列表排序需求

给定主参考列表:

l = ['gala_apple', 'gala_lime', 'fuji_apple', 'fuji_lime']

以及处理后的变体列表:

r = [
    'fuji_apple_1',
    'fuji_apple_2',
    'fuji_lime_1',
    'fuji_lime_2',
    'gala_apple_1',
    'gala_apple_2',
    'gala_apple_3',
    'gala_lime_1',
    'gala_lime_2',
    'gala_lime_3',
]

需要将r排序为以下目标格式:

r = [
    'gala_apple_1',
    'gala_lime_1',
    'gala_apple_2',
    'gala_lime_2',
    'gala_apple_3',
    'gala_lime_3',
    'fuji_apple_1',
    'fuji_lime_1',
    'fuji_apple_2',
    'fuji_lime_2',
]

排序规则

排序逻辑为:

  1. 整体按主列表的分组顺序排列,gala相关元素在前,fuji相关在后
  2. 同一数字后缀下,遵循主列表里的前缀顺序(先gala_apple后gala_lime,先fuji_apple后fuji_lime)
  3. 数字后缀从小到大依次排列,最终呈现为:(gala_apple_1, gala_lime_1, gala_apple_2, gala_lime_2, ...), (fuji_apple_1, fuji_lime_1, fuji_apple_2, fuji_lime_2, ...)的顺序

实现方案

通过自定义排序键即可实现需求,具体代码如下:

l = ['gala_apple', 'gala_lime', 'fuji_apple', 'fuji_lime']
r = [
    'fuji_apple_1',
    'fuji_apple_2',
    'fuji_lime_1',
    'fuji_lime_2',
    'gala_apple_1',
    'gala_apple_2',
    'gala_apple_3',
    'gala_lime_1',
    'gala_lime_2',
    'gala_lime_3',
]

# 构建前缀到优先级的映射,主列表中位置越靠前,优先级数值越小
prefix_priority = {prefix: idx for idx, prefix in enumerate(l)}

def sort_key(item):
    # 拆分元素的前缀和数字后缀(如'gala_apple_3'拆分为'gala_apple'和3)
    prefix, num_str = item.rsplit('_', 1)
    num = int(num_str)
    # 排序键:先按数字后缀升序,再按前缀的优先级升序
    return (num, prefix_priority[prefix])

# 执行排序
r_sorted = sorted(r, key=sort_key)

# 输出验证
for elem in r_sorted:
    print(f"'{elem}',")

运行上述代码后,输出结果与目标排序完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:05:30