最近工作中,需要使用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']
這種思想,還可以用來處理多種條件下的排序,還是挺好用的,也是在工作過程中一位同事告訴我的。
