2016-01-26 17 views
4

當前我試圖對由版本號組成的文件列表進行排序。例如:python中的多個條件的排序列表

0.0.0.0.py 
1.0.0.0.py 
1.1.0.0.py 

它們都存儲在一個列表中。我的想法是將列表的sort方法與lambda表達式結合使用。 lambda表達式首先應刪除.py擴展名,然後按點分割字符串。比鑄造每個數字爲一個整數,並按他們排序。

我知道我會如何在c#中做到這一點,但我不知道如何用python來做到這一點。一個問題是,我如何分類多個標準?以及如何嵌入lambda表達式這樣做?

任何人都可以幫助我嗎?

非常感謝!

回答

5

可以使用sorted功能的關鍵論點:

filenames = [ 
    '1.0.0.0.py', 
    '0.0.0.0.py', 
    '1.1.0.0.py' 
] 

print sorted(filenames, key=lambda f: map(int, f.split('.')[:-1])) 

結果:

['0.0.0.0.py', '1.0.0.0.py', '1.1.0.0.py'] 

拉姆達分割文件名成零件,消除了最後一部分,其餘的轉換爲整數。然後sorted使用此值作爲排序標準。

+0

似乎是最好的解決方案。非常感謝你! – BendEg

3

讓您的key函數返回項目列表。在這種情況下,排序是詞典。

l = [ '1.0.0.0.py', '0.0.0.0.py', '1.1.0.0.py',] 
s = sorted(l, key = lambda x: [int(y) for y in x.replace('.py','').split('.')]) 
print s 
+0

謝謝,我會試試這個! – BendEg

2
# read list in from memory and store as variable file_list 
sorted(file_list, key = lambda x: map(int, x.split('.')[:-1])) 

如果你想知道是怎麼回事就在這裏:

我們的lambda表達式首先把我們的文件名,它分爲以句號隔開的數組。然後我們將列表中的所有元素減去最後一個元素,這是我們的文件擴展名。然後我們將'int'函數應用於列表的每個元素。返回的列表然後根據列表中的元素按照「排序」函數進行排序,從第一個開始,列表中後面的元素中斷了關係。

+0

'[:-1]'處理所有文件擴展名,而不僅僅是'.py'。在分割上使用'map'和'int'。爲那些+1。 – aneroid