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']
2for item in sorted(l):
3 print (item+' ', end='')
运⾏结果:
1 n1 n10 n11 n13 n
2 n20 n21 n2
3 n3
很明显,没有达到我们想要的效果,后来上⽹查资料,发现这篇博客写的可以⽤来参考,地址:。
实现的思想是通过⾃定义排序的⽅式来实现,代码如下,在代码中,使⽤正则表达式匹配字符串尾部的数字。
1import os
2import sys
3import re
4
5def sort_key(s):
6if s:
7try:
8 suffix = re.search('\d+$', s)
9 num = up())
10except:
11 num = -1
12return num
13
14def strsort(alist):
15 alist.sort(key=sort_key)
16return alist
17
18
19if__name__ == "__main__":
20 l = ['n1', 'n2', 'n10', 'n11', 'n21', 'n3', 'n13', 'n20', 'n23']
21 sl = strsort(l)
22print (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的,所以能够实现上述的排序结果。
1import os
2import sys
3import re
4
5def sort_key(s):
6if s:
7try:
8 prefix = re.match('n\d+', s)
9 suffix = re.search('\d+$', s)
10if prefix != None:
11 prefix_num = up()[1:])
12else:
13 prefix_num = -1
14if suffix != None:
15 suffix_num = up())
16else:
17 suffix = -1
18 num = prefix_num * 255 + suffix_num
19except:
20 num = -1
21return num
22
23def strsort(alist):
24 alist.sort(key=sort_key)
25return alist
26
27
28if__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)
31print (l_sorted)
输出结果:
1 ['n1_name_n1', 'n1_name_n3', 'n2_name_n1', 'n2_name_n2', 'n3_name_n1', 'n3_name_n2']
这种思想,还可以⽤来处理多种条件下的排序,还是挺好⽤的,也是在⼯作过程中⼀位同事告诉我的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论