Ich habe ein Verzeichnis von 9 Bilder:Wie listet man eine Bildsequenz auf effiziente Weise auf? Numercial Sequenzvergleich in Python
image_0001, image_0002, image_0003 image_0010, image_0011 image_0011-1, image_0011-2, image_0011-3 image_9999
Ich möchte in der Lage sein, sie auf eine effiziente Art und Weise zu verzeichnen, wie folgt aus (4 Einträge für 9 Bilder):
(image_000[1-3], image_00[10-11], image_0011-[1-3], image_9999)
Gibt es einen Weg in Python, um ein Verzeichnis von Bildern auf eine kurze/klare Art und Weise zurückzugeben (ohne jede Datei aufzulisten)?
Also, vielleicht so etwas wie dieses:
Liste alle Bilder, sortiert numerisch, erstellen Sie eine Liste (jedes Bild in der Reihenfolge von Startzählung). Wenn ein Bild fehlt (eine neue Liste erstellen), fahren Sie fort, bis die ursprüngliche Dateiliste beendet ist. Jetzt sollte ich nur einige Listen haben, die nicht gebrochene Sequenzen enthalten.
Ich versuche es zu erleichtern, eine Liste von Zahlen zu lesen/zu beschreiben. Wenn ich eine Abfolge von 1000 aufeinanderfolgenden Dateien hätte, könnte es eindeutig als Datei [0001-1000] anstelle der Datei ['0001', '0002', '0003' usw. aufgeführt werden]
Edit1 (basierend auf Vorschlag): Wie würden Sie die Glob-Muster ableiten, wenn Sie eine abgeflachte Liste verwenden?
Edit2 Ich versuche, das Problem in kleinere Stücke zu zerlegen. Hier ist ein Beispiel für einen Teil der Lösung: data1 Werke, Daten2 kehrt 0010 als 64, data3 (die reale Welt Daten) funktioniert 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:
data1
[[1, 2, 3], [10, 11], [100], [9999]]
data2
[[1, 2, 3], [8, 9], [64], [9999]]
Warum 'image_00 [10-11]' und nicht 'image_001 [0-1] '? – eumiro
image_00 [10-11] oder image_001 [0-1], ja, ich denke, das ist ein Zeichen weniger – user178686
Zynisch: ja, es gibt einen Weg. Ich bezweifle (könnte aber falsch sein), dass es eine Bibliotheksfunktion dafür gibt. Schreibe etwas Code, frage etwas Spezifischeres (z. B. wie kann ich Zeichenketten auf Ähnlichkeit vergleichen), nachdem du bereits 'os.listdir (Pfad)', etc. getan hast. –