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('n\d+', 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']
这种思想,还可以用来处理多种条件下的排序,还是挺好用的,也是在工作过程中一位同事告诉我的。