2016-05-16 2 views
0

私はPython list.sort()関数に非常に奇妙な問題があります。Python list.sort()が動作していない/奇妙な動作を示しています

私のプログラムでは、os.listdir()でファイルのリストを取得しています。これが最後の要素への第二第三の位置と3.JPGであるべきこと、

['0.jpg', '1.jpg', '10.jpg', '11.jpg', '12.jpg', '13.jpg', '14.jpg', '15.jpg', '16.jpg', '17.jpg', '18.jpg', '19.jpg', '2.jpg', '20.jpg'] 

(このリストに問題があるようなものを返します - 9.jpgは、リストの最後にどこかにあります。 ) 今、私はlist.sort()を行うので、このリスト(最後の数字が最も大きいもの)の最後の要素を取得したいと思います。

これは奇妙なことですが、これはリストには何もしません。私はまた、全く同じリストを返すsorted(list)を試しました。だから私は通訳者を開き、何らかの理由でとなったリスト["3.jpg","2.jpg","5.jpg"]を並べ替えるように言った。

私の質問は次のとおりです:誰でも私はなぜpythonが最初のリストをソートしないのですか?また、この問題をどのように解決すればよいでしょうか?いくつかの回避策がありますか?場合

は興味anyone's:私のコードをhere's:

li=os.listdir("screenshots") 
li.sort() 
print(li) 
+1

'' 10.jpg'の前に来2.jpg'必要がありますなぜ? 'BA'の前に' C'を入れますか? – jwodder

+1

数字ではなく文字列を比較しています。例えば、アルファベット順に '' 10 "<" 2 "'です。 –

+1

この質問を見る:http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural-sort –

答えて

3

Pythonは字句の順序で文字列をソートします。 1の場合、「10」は「2」になります。

リストのソート方法を変更するには、key=パラメータを使用できます。ファイル名は数字だけあると仮定すると、あなたはこのファイル名を分離し、数に変換し、その後、ソートのキーとしてその番号を使用しています

li.sort(key=lambda x: int(x.split(".")[0]))

を使用することができます。

2

ほしいものはnatural sortです。あなたは(hereから)このコードを使用してPythonで自然の並べ替えを行うことができます。

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) 
関連する問題