Wie kann eine Bildsequenz effizient aufgelistet werden? Numerischer Sequenzvergleich in Python

Ich habe ein Verzeichnis von 9 Bildern:

image_0001, image_0002, image_0003
image_0010, image_0011
image_0011-1, image_0011-2, image_0011-3
image_9999

Ich möchte sie auf effiziente Weise auflisten können (4 Einträge für 9 Bilder):

(image_000[1-3], image_00[10-11], image_0011-[1-3], image_9999)

Gibt es in Python eine Möglichkeit, ein Verzeichnis mit Bildern kurz und übersichtlich zurückzugeben (ohne jede Datei aufzulisten)?

Also, möglicherweise so etwas:

Alle Bilder auflisten, numerisch sortieren, eine Liste erstellen (jedes Bild von Anfang an nacheinander zählen). Wenn ein Bild fehlt (neue Liste erstellen), fahren Sie fort, bis die ursprüngliche Dateiliste fertig ist. Jetzt sollte ich nur einige Listen haben, die nicht unterbrochene Sequenzen enthalten.

Ich versuche, das Lesen / Beschreiben einer Nummernliste zu vereinfachen. Wenn ich eine Folge von 1000 aufeinanderfolgenden Dateien hätte, könnte dies eindeutig als Datei [0001-1000] und nicht als Datei ['0001', '0002', '0003' usw. aufgeführt werden.]

Edit1 (basierend auf einem Vorschlag): Wie würden Sie bei einer abgeflachten Liste die Glob-Muster ableiten?

Edit2 Ich versuche das Problem in kleinere Teile zu zerlegen. Hier ist ein Beispiel für einen Teil der Lösung: data1 funktioniert, data2 gibt 0010 als 64 zurück, data3 (die Daten der realen Welt) funktionieren nicht:

# 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

kehrt zurück

data1
[[1, 2, 3], [10, 11], [100], [9999]]

data2
[[1, 2, 3], [8, 9], [64], [9999]]

Antworten auf die Frage(6)

Ihre Antwort auf die Frage