基于主列表对含枚举后缀的列表元素进行排序
自定义列表排序需求
给定主参考列表:
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', ]
排序规则
排序逻辑为:
- 整体按主列表的分组顺序排列,gala相关元素在前,fuji相关在后
- 同一数字后缀下,遵循主列表里的前缀顺序(先
gala_apple后gala_lime,先fuji_apple后fuji_lime) - 数字后缀从小到大依次排列,最终呈现为:
(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
相关产品推荐
相关产品推荐

