如何对字母数字混合数据按自然顺序排序而非字典序
字母数字混合数据自然排序实现方案
默认字典序排序是逐字符比较ASCII值,因此A10中的字符1比A2中的2ASCII值更小,会导致A10排在A2前面。自然排序会把字符串中连续的数字片段作为整数整体比较,即可实现你需要的排序效果。
你当前的字典序排序结果:
A1 A10 A11 A12 A13 A14 A2 A3 A4 A5 A6 A7 A8 A9 B1 B2 B3 B4预期的自然排序结果:
A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 B1 B2 B3 B4
以下是不同常用场景的实现方法:
Python 实现
借助正则拆分字符串生成排序key即可:
import re def natural_sort_key(s): # 按数字片段拆分字符串,数字转整数、非数字转小写统一比较逻辑 return [int(seg) if seg.isdigit() else seg.lower() for seg in re.split(r'(\d+)', s)] # 调用示例 raw_data = ["A1", "A10", "A11", "A12", "A13", "A14", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "B1", "B2", "B3", "B4"] sorted_data = sorted(raw_data, key=natural_sort_key)
Linux Shell 实现
直接使用sort命令自带的-V自然排序参数:
# 假设原始数据存在data.txt文件中,排序后输出到sorted_data.txt sort -V data.txt > sorted_data.txt
JavaScript 实现
function naturalSort(a, b) { const segReg = /(\d+)/g; const aSegs = a.split(segReg); const bSegs = b.split(segReg); for (let i = 0; i < Math.max(aSegs.length, bSegs.length); i++) { const aSeg = aSegs[i] || ''; const bSeg = bSegs[i] || ''; const aIsNum = !isNaN(Number(aSeg)); const bIsNum = !isNaN(Number(bSeg)); if (aIsNum && bIsNum) { const numDiff = Number(aSeg) - Number(bSeg); if (numDiff !== 0) return numDiff; } else { const strDiff = aSeg.localeCompare(bSeg); if (strDiff !== 0) return strDiff; } } return 0; } // 调用示例 const rawData = ["A1", "A10", "A11", "A12", "A13", "A14", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "B1", "B2", "B3", "B4"]; const sortedData = rawData.sort(naturalSort);
Excel 实现
通过辅助列拆分字母前缀和数字后排序:
- 新增「前缀」辅助列,公式为:
=LEFT(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789"))-1) - 新增「数字」辅助列,公式为:
=MID(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789")),LEN(A1))*1 - 选中全表,按「前缀」列升序、再按「数字」列升序排序即可得到自然顺序。
内容的提问来源于stack exchange,提问作者BaconCatBug
相关产品推荐
相关产品推荐

