0

ディレクトリ内の画像ファイルを一覧表示すると、次のようになります。

['IMG_3842.CR2', 'IMG_3843.CR2', 'IMG_3844.CR2', 'IMG_3846.CR2', 'IMG_3847.CR2', 
'IMG_3848.CR2', 'IMG_3849.CR2', 'IMG_3850.CR2', 'IMG_3851.CR2', 'IMG_3852.CR2', 
'IMG_3855.CR2', 'IMG_3856.CR2', 'IMG_3857.CR2', 'IMG_3858.CR2', 'IMG_3859.CR2']

ファイル番号の範囲は 3842 ~ 3859 です。ただし、番号にはギャップがあります。私がする必要があるのは、出力として次のようなリストを取得することです。

3842-3844, 3846-3852, 3855-3859

4

3 に答える 3

1

リストがすでに順序付けられており、すべての項目が同じ形式であると仮定します

l = ['IMG_3842.CR2', 'IMG_3843.CR2', 'IMG_3844.CR2', 'IMG_3846.CR2', 'IMG_3847.CR2', 'IMG_3848.CR2', 'IMG_3849.CR2', 'IMG_3850.CR2', 'IMG_3851.CR2', 'IMG_3852.CR2', 'IMG_3855.CR2', 'IMG_3856.CR2', 'IMG_3857.CR2', 'IMG_3858.CR2', 'IMG_3859.CR2']

numl = [int(x[4:8]) for x in l]

first = numl[0]
result = []

for i in range(len(numl))[1:]:
    if numl[i] != numl[i-1] + 1:
        result.append(str(first) + '-' + str(numl[i-1]))
        first = numl[i]

result.append(str(first) + '-' + str(numl[-1]))

print result

出力:

['3842-3844', '3846-3852', '3855-3859']

于 2012-06-29T16:25:54.713 に答える
1

このようなもの:[繰り返しは簡単です、私はそれを試したかっただけreduceです;)]

S = ['IMG_3842.CR2', 'IMG_3843.CR2', 'IMG_3844.CR2', 'IMG_3846.CR2', 'IMG_3847.CR2', 'IMG_3848.CR2', 'IMG_3849.CR2', 'IMG_3850.CR2', 'IMG_3851.CR2', 'IMG_3852.CR2', 'IMG_3855.CR2', 'IMG_3856.CR2', 'IMG_3857.CR2', 'IMG_3858.CR2', 'IMG_3859.CR2', 'IMG_3863.CR2']

l = sorted([int(x[x.index("_")+1:x.index(".")]) for x in S])

def func(l,val):
    if val == l[-1][1]+1:
        l[-1] = (l[-1][0], l[-1][1]+1)
    else:
        l.append((val,val))
    return l

res = reduce(func, l, [(-1,-1)])[1:]
print [str(x[0]) if x[0] == x[1] else "{}-{}".format(x[0],x[1]) for x in res]

出力:

['3842-3844', '3846-3852', '3855-3859', '3863']
于 2012-06-29T16:13:05.010 に答える
1

シーケンス内の欠落番号に基づく Python 分割リストの参照

import glob
from itertools import groupby

def ranges(seq, key=int):
    return [[x[1] for x in g] for k, g in groupby(enumerate(seq), lambda i,x:i-key(x))]

files = list(glob.glob('*.cr2'))
files.sort()

今、あなたは呼び出すことができます

ranges(files, key=lambda s: int(s[4:8]))

そして得る

[
    ['IMG_3842.CR2',
     'IMG_3843.CR2',
     'IMG_3844.CR2'],
    ['IMG_3846.CR2',
     'IMG_3847.CR2',
     'IMG_3848.CR2',
     'IMG_3849.CR2',
     'IMG_3850.CR2',
     'IMG_3851.CR2',
     'IMG_3852.CR2'],
    ['IMG_3855.CR2',
     'IMG_3856.CR2',
     'IMG_3857.CR2',
     'IMG_3858.CR2',
     'IMG_3859.CR2']
]

編集:

filenums = [f[4:8] for f in files]
range_strings = ["{}-{}".format(rng[0], rng[-1]) for rng in ranges(filenums)]

与える

['3842-3844', '3846-3852', '3855-3859']
于 2012-06-29T16:42:00.057 に答える