1

1つの数字だけが異なり、globによってソートされずに返されるファイル名で構成されるリストをソートする方法(phpのnatsortなど)はありますか?

test1.dat
test7.dat
.
.
test10.dat
test3.dat

単純な並べ替えを行うと、結果は次のようになります

test1.dat
test10.dat
test2.dat
.
.
.

1 は 2 の前に発生するため:) for ループと範囲 (または範囲を含むジェネレーター) を使用して何かを構築できますが、これはやや非 Pythonic に感じます...

4

3 に答える 3

4
sorted(glob.glob('*.dat'), key=lambda x: int(x.split('.')[0][4:]))

これはファイル名を取得し、拡張子を取り除き、4 番目の位置の後の文字の整数値を取得します。「testXXX.dat」で機能します。ここで、XXX は任意の長さの整数です。

于 2012-06-08T10:36:05.530 に答える
0

re(テストされていない)を使用したソリューション:

prefix_number=re.compile(r'(.*)(\d+)\.dat$')
def sortkey(ss):
    match=prefix_number.match(ss)
    if(match):
       return (match.group(0),int(match.group(1))
    else:
       return (ss,)

sorted(glob.iglob('*.dat'), key=sortkey )

このソリューションは、ファイル名をプレフィックス (例: "test") と整数 (例: 1) で分割することによって機能します。次に、1 番目をプレフィックスで、2 番目を整数で並べ替えます。もちろん、欠点は、必要reであり、もう少し複雑なソリューションが必要なことです。

于 2012-06-08T10:41:14.707 に答える
0

eumiroさんの回答は良いです。より柔軟なアプローチを追加したかっただけです。

def natural_sort(data):
    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(data, key=alphanum_key)
于 2012-06-08T10:47:45.130 に答える