2023年8月21日 星期一

Python 學習筆記 : 字串串列的排序問題

明中反映字集排列篩選結果的輸出檔排序怪怪的 :




碼農一看都了解這是字串的 ASCII 編碼排序是由左向右一個一個排序所致, 問題是這要如何解決呢? 這是讀取隨機排列輸出檔 outr 目錄下的所有檔案得到檔案名稱串列後再將檔名設定給 TreeView 元件來顯示檔案名稱 : 

import os
files=[file for file in os.listdir('./outr')]

利用串列生成式即可得到這個檔名字串串列, 基本上會得到下列結果 :

files=['out1', 'out11', 'out12', 'out2']

即使用 sort() 方法或 sorted() 函式去排序, 也不會得到下面想要的結果 :

files=['out1', 'out2', 'out11', 'out12']

那要怎麼做呢? 辦法是要在呼叫 sort() 方法時傳入一個自訂排序函式做為 key 參數, 讓 sort() 依照此 key 去排序, 例如 :

def mysort(list_item):  # list_item='out_1.csv', 'outr_1.csv'
    return int(list_item.split('_')[1][:-4])  # 拆分取後面從頭取至倒數第四

此處傳入參數 list_item 即串列之各元素, 我們想讓 sort() 依據檔名中間的數字當作排序的 key, 所以先將檔名以 '_' 為界拆分為兩部分, 取包含數字頭的第二部分 (索引 1), 然後用切片取開頭到倒數第四 (不含, '.csv' 有四個字元) 即擷取到數字了, 用 int() 轉成整數後傳回給 key 參數, 這樣 sort() 就會依據此整數值來排序了 :

>>> import os
>>> files=['out_1.csv', 'out_11.csv', 'out_12.csv', 'out_2.csv']
>>> def mysort(list_item):  
    return int(list_item.split('_')[1][:-4])
>>> files.sort(key=mysort)
>>> files
['out_1.csv1', 'out_2.csv', 'out_11.csv', 'out_12.csv']

這樣就能依照數字而非字串排序了. 

沒有留言 :