• 介绍一个Python排序函数natsort


    1.能解决什么问题?

    当我们在Python环境下,对含有数字的字符串列表进行排序时,往往会遇到无法正常排序的问题。构建演示案例如下:

    num_list=['1','8','12','20','7','16','a1','a4','a10','a5','a23']
    
    • 1

    列表截图:
    1.1
    利用内置的排序函数sorted进行排序,代码如下:

    sorted(num_list)
    
    • 1

    其排序结果,见下图:

    1.2
    通过上面的例子,我们可以发现对含有数字形式的字符串在利用内置的排序函数sorted排序时,无法对其进行正常的排序。

    2.如何解决?

    为解决上述的问题,可以通过以下代码解决:

    import natsort as ns
    ns.natsorted(num_list)
    
    • 1
    • 2

    运行以上代码,得出以下结果:
    2.a
    如果我们想进行倒序排序,可以进行以下操作:

    import natsort as ns
    ns.natsorted(num_list,reverse=True)
    
    • 1
    • 2

    运行结果如下图:
    2.b

    2.1 排序版本号
    import natsort as ns
    a = ['1.2', '1.2rc1', '1.2beta2', '1.2beta1', '1.2alpha', '1.2.1', '1.1', '1.3']
    ns.natsorted(a)
    
    • 1
    • 2
    • 3

    运行结果如下:
    2.1.a
    如果需要将1.2预发布的版本号置于1.2之后,1.2.1之前,可以使用以下代码:

    ns.natsorted(a,key=lambda x:x.replace('.','~'))
    
    • 1

    运行后截图:
    2.1.b
    如果需要将1.2预发布的版本后置于1.2之前,可以使用以下代码:

    ns.natsorted(a, key=lambda x: x.replace('.', '~')+'z')
    
    • 1

    运行结果见下图:
    2.1.c

    2.2 排序名称

    对产品名称进行排序,一下是几个参考案例
    例子1:

    import pandas as pd
    import natsort as ns
    s = pd.Series(['2-7 class', '1-5 info', '10-2', '2-11', '7-6'])
    s.sort_values(key=ns.natsort_keygen())
    
    • 1
    • 2
    • 3
    • 4

    排序结果见下图:
    2.2.a
    例子2:

    import natsort as ns
    a = ['Apple', 'corn', 'Corn', 'Banana', 'apple', 'banana']
    # 大写优先排序
    ns.natsorted(a)
    #小写优先排序
    ns.natsorted(a, alg=ns.LOWERCASEFIRST)
    #组合排序,即字母相同的排在一起,大写优先
    ns.natsorted(a, alg=ns.GROUPLETTERS)
    #组合排序且小写优先
    ns.natsorted(a, alg=ns.G | ns.LF)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    按照其顺序,分别显示其排序结果:
    2.2.b

    2.3 以utf8编码顺序排序

    对utf8编码的字符排序时,直接改变对应的参数即可。

    ns.natsorted([b'a10', b'a5'], key=ns.decoder('utf8')) 
    
    • 1

    排序结果如下:
    2.3

    2.4 浮点类型排序

    大多数情况下,我们直接调用默认的排序方法natsorted即可,但是个别数据格式不规范的情况下我们可以通过增加参数来进行正确排序。
    排序代码如下:

    # 1. 考虑科学计数法,忽略符号
    ns.natsorted(a, alg=ns.FLOAT)
    # 2. 考虑科学计数法和符号(常用)
    ns.natsorted(a, alg=ns.FLOAT | ns.SIGNED)
    # 3. 不考虑科学计数法,考虑符号
    ns.natsorted(a, alg=ns.FLOAT | ns.SIGNED | ns.NOEXP)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其排序结果如下图:
    2.4

    2.5 路径排序

    大部分情况下,在进行路径排序时,直接使用natsorted方法即可,但极少数情况下需要增加参数才可以使用,具体代码如下

    # 使用默认的排序方法
    a = ['/home/class/test(2).txt', '/home/class/test.txt',
         '/home/class(2)/test.txt', '/home/class(10)/test.txt']
    ns.natsorted(a)
    
    • 1
    • 2
    • 3
    • 4

    默认排序结果如下:
    2.5.1
    通过增加默认参数,代码如下:

    ns.natsorted(a,alg=ns.PATH)
    
    • 1

    其排序结果如下:
    2.5.2

    3.natsort其他功能介绍

    3.1 chain_functions函数

    在一个含有多个函数的列表中,可以将前一个函数的函数值以参数形式传给当前函数。

    funcs=[lambda x:x*3,len,lambda x:x+5]
    func=ns.chain_functions(funcs)
    func("a")
    
    • 1
    • 2
    • 3

    运行结果如下:
    3.1

    3.2 realsorted函数

    该函数通常用来处理浮点数类型

    ns. realsorted(a)
    
    • 1

    排序结果如下:
    3.2

    3.3 index_natsorted函数

    对列表等可迭代对象的索引进行排序,其排序结果为索引,而不是值。

    a=['a12','a5','a100','a3']
    ns.index_natsorted(a)
    
    • 1
    • 2

    其排序结果为列表的索引,如下图所示:
    3.3

    3.4 order_by_index函数

    该函数可以按照某个列表等可迭代对象作为排序基准进行排序,常与index_natsorted函数连用。
    代码如下:

    a=['a12','a5','a100','a3']
    b=[1,3,5,7]
    index=ns.index_natsorted(a)
    ns.order_by_index(b,index=index)
    
    • 1
    • 2
    • 3
    • 4

    排序结果如下图:
    3.4

    3.5 与pandas的结合使用

    pandas对于含有数字的字符串排序

    import pandas as pd
    df = pd.DataFrame({
        'name':['a','c','b','d','e'],
        'v':['20.5', '10.3', '12.3', '5', '6']})
    df
    
    • 1
    • 2
    • 3
    • 4
    • 5

    原始数据截图:
    3.5.1
    使用默认的排序方法进行排序,排序代码和结果如下:
    3.5.2
    结合natsorted函数进行排序,代码如下:

    df.sort_values('v',key= lambda x:ns.index_natsorted(x))
    # 对排序结果,再进行索引排序
    # df.sort_values('v',key= lambda x:ns.index_natsorted(x)).sort_index()
    
    • 1
    • 2
    • 3

    按照降序进行排序,其排序结果如下:
    3.5.3

  • 相关阅读:
    华清远见上海中心22071班
    选择排序、冒泡排序、插入排序【十大经典排序算法】
    oracle-long类型转clob类型及clob类型字段的导出导入
    go语言学习
    深入理解CSS内部样式的编写方式
    限流器设计思路(浅入门)
    设计模式之桥接模式(六)
    TI DSP的中断
    Day03 leecode#有效的括号#合并两个有序链表
    springboot整合elasticsearch
  • 原文地址:https://blog.csdn.net/qq_41780234/article/details/126588966