2016-11-02 18 views
0

からos.listdir()私はフォルダから選んだ何百ものファイルのリストを作成しました。すべてのファイル名は、次のパターンがあります。Python: "part"のうちの1つだけで文字列をソート

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

sorted関数へ

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引数は、本質的に、最初の引数でソートした後、選別の最初のレベルを尊重しつつ、第2引数のソート、マルチ引数の並べ替えを行います。

import re 

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

あなたは数字、残りの文字列バージョンの実行の整数値を含むリストを取り戻す:

+0

splitter(x)[1]のあとにカッコがありません...とにかく動作します。どうもありがとう! –

+0

修正済み。助けてうれしい! – septra

3

汎用自然ソート機能は、次のようなものです。

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

をあなたは、例えば、比較しようとすると、これはPythonの3の問題を引き起こすだろうと思うかもしれません:あなたは、ソートするときkeyとしてこれを使用することができますstrintを比較しようとすると、「123.txt」の「abc.txt」がPy3のエラーです。それでも動作します:の数字のランでを分割しているため、キーの最初の要素は数字の桁で始まる文字列の場合は''です。それは、アルファベットの項目の前に番号の付いた項目を置きます。それがキーの最初の要素であると言う別の方法は、常に文字列(空の場合もあります)であり、2番目の要素は常に整数であるため、文字列の末尾に交互に置き換えます。したがって、Pythonは決して異なるタイプを比較しようとはしません。

関連する問題