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

发布于 2021-02-02 23:24:36

使用Python 3.x,我有一个要对其执行自然字母排序的字符串列表。

自然排序: Windows中文件的排序顺序。

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

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

这是上面列表的“排序”版本(我所拥有的):

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

我正在寻找一种类似于第一个的排序功能。

关注者
0
被浏览
272
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

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


  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    尝试这个:

    import re
    
    def natural_sort(l): 
        convert = lambda text: int(text) if text.isdigit() else text.lower() 
        alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
        return sorted(l, key = alphanum_key)
    

    输出:

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看