小编典典

是否有用于字符串自然排序的内置函数?

all

我有一个字符串列表,我想对其执行自然字母排序

例如,以下列表自然排序(我想要的):

['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']

这是上面列表的“排序”版本(我使用的sorted()):

['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']

我正在寻找一个行为类似于第一个的排序函数。


阅读 214

收藏
2022-03-29

共1个答案

小编典典

PyPI
上有一个名为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 文档以了解限制以及如何获得最佳结果。

2022-03-29