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

如何对字母数字混合数据按自然顺序排序而非字典序

字母数字混合数据自然排序实现方案

默认字典序排序是逐字符比较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 实现

通过辅助列拆分字母前缀和数字后排序:

  1. 新增「前缀」辅助列,公式为:=LEFT(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789"))-1)
  2. 新增「数字」辅助列,公式为:=MID(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789")),LEN(A1))*1
  3. 选中全表,按「前缀」列升序、再按「数字」列升序排序即可得到自然顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:54:03