2016-11-02 58 views
0

通過os.listdir()我創建了從文件夾中拾取的數百個文件的列表。所有的文件名有以下模式:Python:僅通過其中一個「部分」排序字符串

obj1__5 
obj1__10 
obj1__15 
... 
... 
obj1__250 
... 
obj2__5 
obj2__10 
... 
obj2__250 
... and so on up to obj99 

該文件夾中的文件被勒令以下這個方案,但是使用os.listdir()當我得到這樣排序的列表:

obj1__0.png 
obj1__10.png 
obj1__100.png 
obj1__105.png 
... 
obj1__145.png 
obj1__15.png 
obj1__150.png 
obj1__155.png 
... 
obj1__190.png 
obj1__195.png 
obj1__20.png 
obj1__200.png 
obj1__205.png 
... and so on 

有什麼辦法按照它們在文件夾中顯示的順序來拾取文件?或者我可以使用任何排序函數將它們按正確的順序排列?由於

+2

這不是唯一的排序文件 - 你只是有一個字符串列表。你可以編寫一個'key'函數來定義你想要排序的內容。 – jonrsharpe

+2

你想做所謂的自然排序,你可以閱讀更多關於它[這裏](https://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-自然分類) –

+0

@jonrsharpe你是對的。我只是改變了問題的標題,因爲它可能適用於所有字符串。 –

回答

-1

你可以試試:

>>> l = ['obj1__0.png', 'obj1__10.png', 'obj3__15.png', 'obj1__15.png', 'obj2__15.png', 'obj1__100.png'] 
>>> 
>>> sorted(l, key=lambda x: (int(x.split('__')[0][3:]),int(x.split('__')[1].strip('.png')))) 
['obj1__0.png', 'obj1__10.png', 'obj1__15.png', 'obj1__100.png', 'obj2__15.png', 'obj3__15.png'] 
+0

這將不適用於'obj '部分 –

+0

@FranciscoCouzo,我想我解決了它 - 如果您發現任何其他錯誤讓我知道... – coder

+0

是的,它的工作原理。非常感謝你。 –

1

這應該爲你工作。

import os 
import re 

def splitter(name):           
    reg = re.search("(\d+)__(\d+)", name) 
    return (int(reg.group(1)), int(reg.group(2))) 

files = map(lambda x: (x, splitter(x)[0], splitter(x)[1]), os.listdir()) 

temp = sorted(files, key = lambda x: (x[1], x[2])) 

sortedFiles = map(lambda x: x[0], temp) 

key的參數給sorted功能基本上做了多參數的排序,由第一個參數排序,然後在第二個參數排序同時尊重分揀的第一級。

+0

你在splitter(x)[1]之後遺漏了一個圓括號...無論如何它工作。非常感謝! –

+0

固定。樂意效勞! – septra

3

通用自然排序的功能是這樣的:

import re 

def naturalsort(name, digits=re.compile("([0-9]+)")): 
    return [int(x) if x.isdigit() else x for x in digits.split(name)] 

你找回包含的數字,其餘的字符串版本運行的整數值列表。排序時,您可以使用此作爲key

sorted(os.listdir(), key=naturalsort) 

你可能會認爲這會導致在Python 3個問題,當您嘗試比較例如「abc.txt」和「123.txt」,因爲試圖比較strint是Py3中的錯誤。它仍然有效:因爲我們在運行數字時分割,對於以數字運行開始的字符串,密鑰的第一個元素爲''。其中任何字母之前的數字項目,他們應該是。另一種說法是,鍵的第一個元素始終是一個字符串(可能爲空),第二個元素總是一個整數,等等交替到字符串的末尾。因此Python絕不會試圖比較不同的類型。

相關問題