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

根据序列中缺失的数字参考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 回答
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 回答