我有一个字符串列表,我想对其进行自然的字母排序。例如,以下列表是自然排序的(我想要的):['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', '
我有一个字符串列表,我想对其进行 自然字母排序 .
例如,以下列表是自然排序的(我想要的):
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
这里是上面列表的“排序”版本(我使用 sorted()
):
['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']
我正在寻找一个与第一个行为相似的排序函数。
的第三方库 natsort (坦白说,我是这个包的作者)。对于你的情况,你可以做以下任一操作:
>>> from natsort import natsorted, ns
>>> x = ['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']
>>> natsorted(x, key=lambda y: y.lower())
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
>>> natsorted(x, alg=ns.IGNORECASE) # or alg=ns.IC
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
您应该注意到,它 natsort
使用通用算法,因此它应该适用于您向其输入的任何输入。如果您想详细了解为什么选择使用库来执行此操作而不是使用自己的函数,请查看文档 natsort
的“ 工作原理” 页面,尤其是 “特殊情况无处不在!” 部分。
如果您需要排序键而不是排序函数,请使用以下任一公式。
>>> from natsort import natsort_keygen, ns
>>> l1 = ['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
>>> l2 = l1[:]
>>> natsort_key1 = natsort_keygen(key=lambda y: y.lower())
>>> l1.sort(key=natsort_key1)
>>> l1
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
>>> natsort_key2 = natsort_keygen(alg=ns.IGNORECASE)
>>> l2.sort(key=natsort_key2)
>>> l2
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
2020 年 11 月更新
鉴于一个常见的请求/问题是“如何像 Windows 资源管理器一样排序?”(或您操作系统的文件系统浏览器),从 natsort
版本 7.1.0 开始,有一个名为 os_sorted
可以做到这一点。在 Windows 上,它将按照与 Windows 资源管理器相同的顺序进行排序,而在其他操作系统上,它应该像本地文件系统浏览器一样进行排序。
>>> from natsort import os_sorted
>>> os_sorted(list_of_paths)
# your paths sorted like your file system browser
对于那些需要排序键的用户,您可以使用 os_sort_keygen
(或者 os_sort_key
如果您只需要默认值)。
警告 - 请在使用前阅读此功能的 API 文档,以了解其局限性以及如何获得最佳结果。