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']

這種思想,還可以用來處理多種條件下的排序,還是挺好用的,也是在工作過程中一位同事告訴我的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM