5

名前でソートする必要があるファイルがいくつかありますが、残念ながら、文字列内の数字もソートしたいので、通常のソートは使用できません。ソート

ここに記載されている解決策を試してみましたが、完全に機能しました。

ただし、PresserInc-1_10.jpgandのような文字列の場合、PresserInc-1_11.jpgその特定の自然キー アルゴリズムが失敗します。これは、この場合は1and1になる最初の整数にのみ一致するため、並べ替えが失敗するためです。だから私が助けるかもしれないと思うのは、文字列内のすべての数字を照合してそれらをグループ化すること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']

4

2 に答える 2

12

Google: Python natural sorting.

Result 1: The page you linked to.

But don't stop there!

Result 2: Jeff Atwood's blog that explains how to do it properly.

Result 3: An answer I posted based on Jeff Atwood's blog.

Here's the code from that answer:

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)

Results for your data:

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

See it working online: ideone

于 2012-06-22T04:57:53.940 に答える
3

サードパーティのライブラリを気にしない場合は、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']
于 2014-05-06T05:26:29.120 に答える