Python是否具有内置的字符串自然排序功能?

问题:

使用Python 3.x,我有一个字符串列表,我想执行一个自然的字母排序。
 自然分类: Windows中的文件排序顺序。
例如,以下列表是自然排序(我想要的):

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

这里是上面列表的“排序”版本(我有什么):

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

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

回答:

在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文档的How It Works页面,特别是Special Cases Everywhere!部分。
如果您需要排序键而不是排序功能,请使用下列公式之一。

>>> 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']

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Does Python have a built in function for string natural sort?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

60 − = 51