如何对含逗号分隔数字、字母数字混合值的列进行自定义排序
排序规则解析
你需要的排序逻辑可以拆解为以下优先级:
- 第一优先级:纯数字(含逗号分隔的数字组合)条目排在最前,带
_L/_R后缀的条目排在后面 - 第二优先级(纯数字组内):提取条目中的首个数字,按数字大小升序排列
- 第三优先级(带后缀条目组内):
- 后缀
_L排在_R前面 - 同后缀条目提取前缀的核心数字,按数字大小升序排列
- 前缀含斜杠的条目,按斜杠分隔的多段数字依次升序排列
- 后缀
代码实现示例
Python 实现
import re def custom_sort_key(s): # 匹配纯数字/逗号分隔的条目 if re.fullmatch(r'[\d,]+', s): first_num = int(re.match(r'\d+', s).group()) # 纯数组优先级为0 return (0, first_num) else: # 拆分后缀和前缀 suffix = s.split('_')[-1] prefix = '_'.join(s.split('_')[:-1]) # 提取前缀所有数字段 prefix_nums = list(map(int, re.findall(r'\d+', prefix))) # 后缀优先级:L为0,R为1 suffix_order = 0 if suffix == 'L' else 1 # 带后缀组优先级为1 return (1, suffix_order, *prefix_nums) # 原始数据(已去掉表头) raw_data = [ '3', '5', '1,2', '10', '6,7,8,9', '2_L', '1_L', '3_R', '1_R', '4_L', '3_L', '2_R', '4', '3/2_R', '3/1_R' ] # 执行排序 sorted_data = sorted(raw_data, key=custom_sort_key) print(sorted_data)
注:原始数据中的
10按规则会排在6,7,8,9之后,你给出的预期结果未包含该条目,可根据需求自行过滤。
MySQL 实现
如果是对数据库表的description字段排序,可以用以下语句:
SELECT description FROM 你的表名 ORDER BY -- 纯数字组在前 description REGEXP '^[0-9,]+$' DESC, -- 纯数字组按首个数字升序 IF(description REGEXP '^[0-9,]+$', CAST(SUBSTRING_INDEX(description, ',', 1) AS UNSIGNED), 999999) ASC, -- 带后缀组先按L/R排序 IF(description LIKE '%\_L', 0, 1) ASC, -- 按前缀第一段数字升序 CAST(SUBSTRING_INDEX(description, '_', 1) AS UNSIGNED) ASC, -- 处理斜杠分隔的第二段数字 CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(description, '/', -1), '_', 1) AS UNSIGNED) ASC;
内容的提问来源于stack exchange,提问作者Oscar2315
相关产品推荐
相关产品推荐

