zoukankan      html  css  js  c++  java
  • python-一种字符串排序方式

    最近工作中,需要使用python实现一种排序方式,简要说明如下:

    1.排序方式

    假设有一个序列,数据为:['n1', 'n2', 'n10', 'n11', 'n21', 'n3', 'n13', 'n20', 'n23'],

    排序后需要达到这个效果:['n1', 'n2', 'n3', 'n10', 'n11', 'n13', 'n20', 'n21', 'n23']。

    最开始当然想的是使用内建函数sorted()进行排序,但效果如下:

    1    l = ['n1', 'n2', 'n10', 'n11', 'n21', 'n3', 'n13', 'n20', 'n23']
    2    for item in sorted(l):
    3    print (item+' ', end='')

    运行结果:

    1 n1 n10 n11 n13 n2 n20 n21 n23 n3

    很明显,没有达到我们想要的效果,后来上网查资料,发现这篇博客写的可以用来参考,地址:python 根据字符串内数字排序

    实现的思想是通过自定义排序的方式来实现,代码如下,在代码中,使用正则表达式匹配字符串尾部的数字。

     1 import os
     2 import sys
     3 import re
     4 
     5 def sort_key(s):
     6     if s:
     7         try:
     8             suffix = re.search('d+$', s)
     9             num = int(suffix.group())
    10         except:
    11             num = -1
    12         return num
    13 
    14 def strsort(alist):
    15     alist.sort(key=sort_key)
    16     return alist
    17 
    18 
    19 if __name__ == "__main__":
    20     l = ['n1', 'n2', 'n10', 'n11', 'n21', 'n3', 'n13', 'n20', 'n23']
    21     sl = strsort(l)
    22     print (sl)

    输出结果:

    1 ['n1', 'n2', 'n3', 'n10', 'n11', 'n13', 'n20', 'n21', 'n23']

    可以看出,通过这种方法可以实现我们想要的排序方式。

    2.扩展

    现在,做一些扩展,假设现在需要排序的字符串的格式组成方式为:nxxx_name_nxxx,也就是由前缀数字和后缀数字组成,例如,我们要把下列的这些字符串进行排序:

    n1_name_n1、n2_name_n2、n1_name_n3、n2_name_n1、n3_name_n1、n3_name_n2,先以前缀数字优先排序,再以后缀数字优先排序。排序后得到的顺序为:

    n1_name_n1、n1_name_n3、n2_name_n1、n2_name_n2、n3_name_n1、n3_name_n2,那么我们可以给前缀数字赋一个很大的权重,再加上后缀,组成的数字就是排序的依据。

    实现代码如下,在代码中,我给前缀的数字乘上了255,后缀的数字没有大于255的,所以能够实现上述的排序结果。

     1 import os
     2 import sys
     3 import re
     4 
     5 def sort_key(s):
     6     if s:
     7         try:
     8             prefix = re.match('nd+', s)
     9             suffix = re.search('d+$', s)
    10             if prefix != None:
    11                 prefix_num = int(prefix.group()[1:])
    12             else:
    13                 prefix_num = -1
    14             if suffix != None:
    15                 suffix_num = int(suffix.group())
    16             else:
    17                 suffix = -1
    18             num = prefix_num * 255 + suffix_num
    19         except:
    20             num = -1
    21         return num
    22 
    23 def strsort(alist):
    24     alist.sort(key=sort_key)
    25     return alist
    26 
    27 
    28 if __name__ == "__main__":  
    29     l_raw = ["n1_name_n1", "n2_name_n2", "n1_name_n3", "n2_name_n1", "n3_name_n1", "n3_name_n2"]
    30     l_sorted = strsort(l_raw)
    31     print (l_sorted)

    输出结果:

    1 ['n1_name_n1', 'n1_name_n3', 'n2_name_n1', 'n2_name_n2', 'n3_name_n1', 'n3_name_n2']

    这种思想,还可以用来处理多种条件下的排序,还是挺好用的,也是在工作过程中一位同事告诉我的。

  • 相关阅读:
    CentOS下Zabbix安装部署及汉化
    用jmeter通过ssl验证访问https
    VMware安装CentOS时,无法以图形界面安装解决办法
    MySQL数据库不能远程访问的解决办法
    CentOS搭建LNMP环境
    jstack+top定位性能问题
    用Fiddler模拟低速网络环境
    Linux下history命令用法
    Jmeter3.0发布,版本更新都更新了什么
    【转】gc日志分析工具
  • 原文地址:https://www.cnblogs.com/mrlayfolk/p/12577593.html
Copyright © 2011-2022 走看看