natsort 库,它是一个专门用于自然排序(Natural Sorting)的库。
什么是自然排序?
自然排序是按照人类直觉的方式对字符串中的数字进行排序:
- 普通排序:
["file2", "file10", "file1"] → ["file1", "file10", "file2"]
- 自然排序:
["file2", "file10", "file1"] → ["file1", "file2", "file10"]
安装
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 特别适合处理包含数字的文件名、版本号、带数字的文本数据等场景,让排序结果更符合人类直觉。