Python小技巧:一種字串的排序方式

Python探索牛發表於2024-05-27

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

這種思想,還可以用來處理多種條件下的排序,還是挺好用的

相關文章