1.排序方式
假設有一個序列,資料為:['n1', 'n2', 'n10', 'n11', 'n21', 'n3', 'n13', 'n20', 'n23'],
排序後需要達到這個效果:['n1', 'n2', 'n3', 'n10', 'n11', 'n13', 'n20', 'n21', 'n23']。
最開始當然想的是使用內建函式sorted()進行排序,但效果如下:
l = ['n1', 'n2', 'n10', 'n11', 'n21', 'n3', 'n13', 'n20', 'n23']
for item in sorted(l):
print (item+' ', end='')
執行結果:
n1 n10 n11 n13 n2 n20 n21 n23 n3
很明顯,沒有達到我們想要的效果,後來上網查資料,發現這篇部落格寫的可以用來參考,地址:python 根據字串內數字排序。
實現的思想是透過自定義排序的方式來實現,程式碼如下,在程式碼中,使用正規表示式匹配字串尾部的數字。
import os
import sys
import re
def sort_key(s):
if s:
try:
suffix = re.search('\d+$', s)
num = int(suffix.group())
except:
num = -1
return num
def strsort(alist):
alist.sort(key=sort_key)
return alist
if __name__ == "__main__":
l = ['n1', 'n2', 'n10', 'n11', 'n21', 'n3', 'n13', 'n20', 'n23']
sl = strsort(l)
print (sl)
輸出結果:
['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的,所以能夠實現上述的排序結果。
import os
import sys
import re
def sort_key(s):
if s:
try:
prefix = re.match('n\d+', s)
suffix = re.search('\d+$', s)
if prefix != None:
prefix_num = int(prefix.group()[1:])
else:
prefix_num = -1
if suffix != None:
suffix_num = int(suffix.group())
else:
suffix = -1
num = prefix_num * 255 + suffix_num
except:
num = -1
return num
def strsort(alist):
alist.sort(key=sort_key)
return alist
#學習中遇到問題沒人解答?小編建立了一個Python學習交流群:153708845
if __name__ == "__main__":
l_raw = ["n1_name_n1", "n2_name_n2", "n1_name_n3", "n2_name_n1", "n3_name_n1", "n3_name_n2"]
l_sorted = strsort(l_raw)
print (l_sorted)
輸出結果:
['n1_name_n1', 'n1_name_n3', 'n2_name_n1', 'n2_name_n2', 'n3_name_n1', 'n3_name_n2']
這種思想,還可以用來處理多種條件下的排序,還是挺好用的