2012-06-22 99 views
4

我有一些需要按名稱排序的文件,不幸的是我不能使用常規排序,因爲我也想排序字符串中的數字,所以我做了一些研究,發現我我正在尋找叫做natural sortingPython自然排序

我試着給出的解決方案here,它的工作完美。

然而,對於像PresserInc-1_10.jpgPresserInc-1_11.jpg串導致特定自然密鑰算法失敗,因爲它僅匹配在這種情況下會11的第一個整數,所以它拋出了排序。所以我認爲可能會幫助的是匹配字符串中的所有數字並將它們組合在一起,所以如果我有PresserInc-1_11.jpg算法應該給我回111,所以我的問題是,這可能嗎?

這裏的文件名列表:

files = ['PresserInc-1.jpg', 'PresserInc-1_10.jpg', 'PresserInc-1_11.jpg', 'PresserInc-10.jpg', 'PresserInc-2.jpg', 'PresserInc-3.jpg', 'PresserInc-4.jpg', 'PresserInc-5.jpg', 'PresserInc-6.jpg', 'PresserInc-11.jpg']

+1

我不明白你的問題...請張貼更加清晰的輸入和輸出預計在 –

回答

8

Google: Python natural sorting

Result 1:您鏈接到的頁面。

但不要停在那裏!

Result 2:傑夫阿特伍德的博客,解釋如何正確地做到這一點。

Result 3:我根據Jeff Atwood的博客發佈的答案。

下面是這個問題的答案代碼:

import re 

def natural_sort(l): 
    convert = lambda text: int(text) if text.isdigit() else text.lower() 
    alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] 
    return sorted(l, key=alphanum_key) 

結果爲您的數據:

 
PresserInc-1.jpg 
PresserInc-1_10.jpg 
PresserInc-1_11.jpg 
PresserInc-2.jpg 
PresserInc-3.jpg 
etc... 

看到它聯機工作:ideone

+1

'鍵= alphanum_key'請 –

+0

由於沒有空格,你是對的不應該停在那裏:)雖然有點累..謝謝:) – Paulo

2

如果你不介意的第三方庫,您可以使用natsort來實現此目的。

>>> import natsort 
>>> files = ['PresserInc-1.jpg', 'PresserInc-1_10.jpg', 'PresserInc-1_11.jpg', 'PresserInc-10.jpg', 'PresserInc-2.jpg', 'PresserInc-3.jpg', 'PresserInc-4.jpg', 'PresserInc-5.jpg', 'PresserInc-6.jpg', 'PresserInc-11.jpg'] 
>>> natsort.natsorted(files) 
['PresserInc-1.jpg', 
'PresserInc-1_10.jpg', 
'PresserInc-1_11.jpg', 
'PresserInc-2.jpg', 
'PresserInc-3.jpg', 
'PresserInc-4.jpg', 
'PresserInc-5.jpg', 
'PresserInc-6.jpg', 
'PresserInc-10.jpg', 
'PresserInc-11.jpg']