私は9つの画像のディレクトリを持っています:
image_0001、image_0002、image_0003 image_0010、image_0011 image_0011-1、image_0011-2、image_0011-3 画像_9999
次のように、効率的な方法でそれらをリストできるようにしたいと思います (9 つの画像に対して 4 つのエントリ)。
(image_000[1-3]、image_00[10-11]、image_0011-[1-3]、image_9999)
Pythonで、画像のディレクトリを短い/明確な方法で返す方法はありますか(すべてのファイルをリストすることなく)?
したがって、おそらく次のようなものです。
すべての画像を一覧表示し、数値で並べ替え、リストを作成します (各画像を最初から順番に数えます)。画像が欠落している場合 (新しいリストを作成) は、元のファイル リストが終了するまで続行します。これで、壊れていないシーケンスを含むリストがいくつか必要になります。
数字のリストを読みやすく/記述しやすくしようとしています。1000 個の連続したファイルのシーケンスがある場合、ファイル ['0001','0002','0003' など...] ではなく、ファイル [0001-1000] として明確にリストできます。
Edit1 (提案に基づく): フラット化されたリストが与えられた場合、グロブ パターンをどのように導出しますか?
Edit2 問題を小さな断片に分解しようとしています。ソリューションの一部の例を次に示します。data1 は機能し、data2 は 64 として 0010 を返し、data3 (実際のデータ) は機能しません。
# Find runs of consecutive numbers using groupby. The key to the solution
# is differencing with a range so that consecutive numbers all appear in
# same group.
from operator import itemgetter
from itertools import *
data1=[01,02,03,10,11,100,9999]
data2=[0001,0002,0003,0010,0011,0100,9999]
data3=['image_0001','image_0002','image_0003','image_0010','image_0011','image_0011-2','image_0011-3','image_0100','image_9999']
list1 = []
for k, g in groupby(enumerate(data1), lambda (i,x):i-x):
list1.append(map(itemgetter(1), g))
print 'data1'
print list1
list2 = []
for k, g in groupby(enumerate(data2), lambda (i,x):i-x):
list2.append(map(itemgetter(1), g))
print '\ndata2'
print list2
戻り値:
data1
[[1, 2, 3], [10, 11], [100], [9999]]
data2
[[1, 2, 3], [8, 9], [64], [9999]]