Python natsort库实现自然排序
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、什么是自然排序?</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">字典序 vs 自然序</a></li></ul><li><a href="#_label1">二、快速入门</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_1">安装</a></li><li><a href="#_lab2_1_2">基础用法</a></li></ul><li><a href="#_label2">三、六大核心应用场景</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_3">1. 文件名排序</a></li><li><a href="#_lab2_2_4">2. 版本号排序</a></li><li><a href="#_lab2_2_5">3. 混合文本排序</a></li><li><a href="#_lab2_2_6">4. IP地址排序</a></li><li><a href="#_lab2_2_7">5. 复杂数据结构排序</a></li><li><a href="#_lab2_2_8">6. 科学数据排序</a></li></ul><li><a href="#_label3">四、高级技巧</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_9">1. 忽略大小写</a></li><li><a href="#_lab2_3_10">2. 逆序排序</a></li><li><a href="#_lab2_3_11">3. 多字段排序</a></li></ul></ul></div><p>在数据处理和文件管理中,我们经常遇到需要排序的字符串包含数字的情况。Python 内置的 <code>sorted()</code> 函数在遇到 <code>"file2.txt"</code> 和 <code>"file10.txt"</code> 时会给出违反直觉的结果,这时就需要自然排序(Natural Sorting)。本文将深入介绍 Python 的 natsort 库,带你解锁智能排序新姿势。</p><p class="maodian"><a name="_label0"></a></p><h2>一、什么是自然排序?</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>字典序 vs 自然序</h3>
<p>假设有以下文件名列表:</p>
<div class="jb51code"><pre class="brush:py;">files = ["file1.txt", "file10.txt", "file2.txt", "file20.txt"]
</pre></div>
<table><thead><tr><th>排序方式</th><th>结果</th></tr></thead><tbody><tr><td>字典序(sorted()</td><td>[‘file1.txt’, ‘file10.txt’, ‘file2.txt’, ‘file20.txt’]</td></tr><tr><td>自然序(natsorted())</td><td>[‘file1.txt’, ‘file2.txt’, ‘file10.txt’, ‘file20.txt’]</td></tr></tbody></table>
<p>自然排序的核心特点:智能识别字符串中的数字部分,按照数值大小进行排序。</p>
<p class="maodian"><a name="_label1"></a></p><h2>二、快速入门</h2>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>安装</h3>
<div class="jb51code"><pre class="brush:bash;">pip install natsort
</pre></div>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>基础用法</h3>
<div class="jb51code"><pre class="brush:py;">from natsort import natsorted
files = ["image99.jpg", "image100.jpg", "image1.jpg"]
print(natsorted(files))# ['image1.jpg', 'image99.jpg', 'image100.jpg']
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>三、六大核心应用场景</h2>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>1. 文件名排序</h3>
<p>处理带有序号的图像帧、日志文件等:</p>
<div class="jb51code"><pre class="brush:py;">import os
files = os.listdir("video_frames")
sorted_files = natsorted(files)# 自动处理 frame_1.jpg, frame_2.jpg...frame_10.jpg
</pre></div>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>2. 版本号排序</h3>
<p>正确处理软件版本号:</p>
<div class="jb51code"><pre class="brush:py;">versions = ["v1.2.3", "v1.10.0", "v2.0.0-beta", "v1.9.1"]
print(natsorted(versions))# ['v1.2.3', 'v1.9.1', 'v1.10.0', 'v2.0.0-beta']
</pre></div>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>3. 混合文本排序</h3>
<p>处理包含数字的中文/英文混合文本:</p>
<div class="jb51code"><pre class="brush:py;">chapters = ["第5章", "第12章", "第1章"]
print(natsorted(chapters))# ['第1章', '第5章', '第12章']
</pre></div>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>4. IP地址排序</h3>
<p>网络管理场景下的IP地址排序:</p>
<div class="jb51code"><pre class="brush:py;">ips = ["192.168.1.100", "192.168.1.2", "192.168.1.20"]
print(natsorted(ips))# ['192.168.1.2', '192.168.1.20', '192.168.1.100']
</pre></div>
<p class="maodian"><a name="_lab2_2_7"></a></p><h3>5. 复杂数据结构排序</h3>
<p>对字典列表按特定字段排序:</p>
<div class="jb51code"><pre class="brush:py;">products = [
{"name": "Product 2", "price": 50},
{"name": "Product 10", "price": 30},
{"name": "Product 1", "price": 40}
]
print(natsorted(products, key=lambda x: x["name"]))
# [{'name': 'Product 1', 'price': 40}, {'name': 'Product 2', 'price': 50}, ...]
</pre></div>
<p class="maodian"><a name="_lab2_2_8"></a></p><h3>6. 科学数据排序</h3>
<p>处理实验数据编号:</p>
<div class="jb51code"><pre class="brush:py;">samples = ["Sample-1M", "Sample-500K", "Sample-100K"]
print(natsorted(samples))# ['Sample-100K', 'Sample-500K', 'Sample-1M']
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>四、高级技巧</h2>
<p class="maodian"><a name="_lab2_3_9"></a></p><h3>1. 忽略大小写</h3>
<div class="jb51code"><pre class="brush:py;">from natsort import ns
files = ["FileA.txt", "fileC.txt", "FILEb.txt"]
print(natsorted(files, alg=ns.IGNORECASE))# ['FileA.txt', 'FILEb.txt', 'fileC.txt']
</pre></div>
<p class="maodian"><a name="_lab2_3_10"></a></p><h3>2. 逆序排序</h3>
<div class="jb51code"><pre class="brush:py;">print(natsorted(files, reverse=True))# ['file20.txt', 'file10.txt', 'file2.txt', 'file1.txt']
</pre></div>
<p class="maodian"><a name="_lab2_3_11"></a></p><h3>3. 多字段排序</h3>
<div class="jb51code"><pre class="brush:py;">data = ["v1-2", "v1-10", "v2-1", "v1-1"]
print(natsorted(data, key=lambda x: (x.split('-'), x.split('-'))))
</pre></div>
頁:
[1]