济南市临终服务网

Python natsort库实现自然排序

2026-03-30 12:48:04 浏览次数:0
详细信息

natsort 库,它是一个专门用于自然排序(Natural Sorting)的库。

什么是自然排序?

自然排序是按照人类直觉的方式对字符串中的数字进行排序:

安装

pip install natsort

基本使用

1. 对列表排序

from natsort import natsorted

items = ["file2.txt", "file10.txt", "file1.txt"]
sorted_items = natsorted(items)
print(sorted_items)  # ['file1.txt', 'file2.txt', 'file10.txt']

2. 反转排序

from natsort import natsorted

items = ["file2.txt", "file10.txt", "file1.txt"]
sorted_items = natsorted(items, reverse=True)
print(sorted_items)  # ['file10.txt', 'file2.txt', 'file1.txt']

主要函数

natsorted() - 返回排序后的新列表

from natsort import natsorted

data = ["item2", "item12", "item1"]
result = natsorted(data)
print(result)  # ['item1', 'item2', 'item12']

index_natsorted() - 返回排序索引

from natsort import index_natsorted

data = ["z2", "y10", "x1"]
indices = index_natsorted(data)
print(indices)  # [2, 0, 1]

# 使用索引排序
sorted_data = [data[i] for i in indices]
print(sorted_data)  # ['x1', 'z2', 'y10']

order_by_index() - 按索引排序

from natsort import index_natsorted, order_by_index

data = ["z2", "y10", "x1"]
indices = index_natsorted(data)
sorted_data = order_by_index(data, indices)
print(sorted_data)  # ['x1', 'z2', 'y10']

os_sorted() - 考虑操作系统规则的排序

from natsort import os_sorted

files = ["File.txt", "file.txt", "FILE.txt"]
# Windows 不区分大小写,Linux/macOS 区分
result = os_sorted(files)

高级功能

1. 忽略大小写

from natsort import natsorted, ns

data = ["Apple", "banana", "apple", "Banana"]
# 方法1:使用 alg 参数
sorted1 = natsorted(data, alg=ns.IGNORECASE)
print(sorted1)  # ['Apple', 'apple', 'Banana', 'banana']

# 方法2:使用 key 参数
sorted2 = natsorted(data, key=lambda x: x.lower())
print(sorted2)

2. 处理不同类型的数据

from natsort import natsorted

# 混合类型数据
mixed = ["a1", "a10", 2, "1", 10]
result = natsorted(mixed)
print(result)  # ['1', 2, 'a1', 'a10', 10]

3. 路径排序

from natsort import natsorted

paths = [
    "/path/to/file_1.txt",
    "/path/to/file_10.txt", 
    "/path/to/file_2.txt"
]
sorted_paths = natsorted(paths)
print(sorted_paths)

4. 多级排序

from natsort import natsorted

data = [
    ("folder2", "file10.txt"),
    ("folder1", "file2.txt"),
    ("folder2", "file1.txt"),
    ("folder1", "file10.txt")
]

# 先按文件夹名,再按文件名排序
sorted_data = natsorted(data, key=lambda x: (x[0], x[1]))
print(sorted_data)

完整示例

from natsort import natsorted, ns

# 示例数据
files = [
    "Chapter 1.txt",
    "Chapter 10.txt",
    "Chapter 2.txt",
    "appendix A.txt",
    "appendix B.txt"
]

# 简单自然排序
print("基础排序:")
print(natsorted(files))

# 带选项的排序
print("\n忽略大小写排序:")
print(natsorted(["File1", "file2", "FILE3"], alg=ns.IGNORECASE))

# 实际应用:处理文件列表
import os

# 假设我们有一个目录的文件列表
file_list = [
    "data_2023_01.csv",
    "data_2023_10.csv",
    "data_2023_02.csv",
    "data_2022_12.csv"
]

print("\n按时间顺序的文件:")
sorted_files = natsorted(file_list)
for f in sorted_files:
    print(f)

常用选项(ns 常量)

from natsort import ns

# 组合多个选项
sorted_data = natsorted(
    data,
    alg=ns.INT | ns.FLOAT | ns.IGNORECASE
)

# 常用选项:
# ns.INT - 按整数排序(默认)
# ns.FLOAT - 按浮点数排序
# ns.IGNORECASE - 忽略大小写
# ns.LOCALE - 使用本地语言环境
# ns.PATH - 更适合文件路径
# ns.UNSIGNED - 忽略负号

与内置 sorted() 的比较

from natsort import natsorted

data = ["item2", "item12", "item1"]

# 内置 sorted() - 字典序
print("Built-in sorted:", sorted(data))
# 输出: ['item1', 'item12', 'item2']

# natsorted() - 自然排序
print("natsorted:", natsorted(data))
# 输出: ['item1', 'item2', 'item12']

natsort 特别适合处理包含数字的文件名、版本号、带数字的文本数据等场景,让排序结果更符合人类直觉。

相关推荐