Programmierung unter AOO/LO (StarBasic, Python, Java, ...)
Moderator: Moderatoren
preklov
***
Beiträge: 76 Registriert: Mo, 29.06.2009 09:04
Wohnort: Ruhrgebiet
Beitrag
von preklov » Sa, 20.02.2016 19:13
Ich möchte eine Liste von Dateinamen ausgeben, und zwar unabhängig von Groß-/Kleinschreibung sortiert nach den eigentlichen Namen und erst sekundär nach der Erweiterung.
Meine Lösung sieht so aus:
Code: Alles auswählen
def sort_file_names(fileNames, down=False):
"""
Sortiert eine Liste von Dateinamen alphanumerisch nach Großbuchstaben.
Sortiert primär die eigentlichen Namen, sekundär die Ergänzungen.
Gibt eine sortierte Kopie der Liste zurück.
"""
import os
if len(fileNames) == 0:
return []
maxLen = max([len(os.path.splitext(n)[0]) for n in fileNames])
# Normiert die Namen linksbündig auf gleiche Länge.
adjustedNames = [u[0].ljust(maxLen) + u[1]
for u in [os.path.splitext(n.upper())
for n in fileNames]]
dictOfNames = {key: value for key, value in zip(adjustedNames, fileNames)}
return [dictOfNames[key] for key in sorted(adjustedNames, reverse=down)]
Welche bessere Lösung gibt es?
Schöne Grüße
Volker
Schöne Grüße
Volker
komma4
********
Beiträge: 5332 Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:
Beitrag
von komma4 » Sa, 20.02.2016 21:08
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
preklov
***
Beiträge: 76 Registriert: Mo, 29.06.2009 09:04
Wohnort: Ruhrgebiet
Beitrag
von preklov » Sa, 20.02.2016 22:07
warum nicht sorted
sorted['a.b', 'a b.b'] ergibt ['a b.b', 'a.b'].
Ich will aber nach Namen sortieren, die Ergänzung soll sekundäres Kriterium sein. Das Ergebnis soll also ['a.b', 'a b.b'] sein.
Schöne Grüße
Volker
Schöne Grüße
Volker
komma4
********
Beiträge: 5332 Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:
Beitrag
von komma4 » Sa, 20.02.2016 23:13
dann nimm den Dateiname-Teil als ersten Schlüssel. die Erweiterung als zweiten:
Code: Alles auswählen
sorted(filenames, key=lambda x: (x.split('.')[0], x.split('.')[1]))
edit: falls Punkte im Dateinamen vorkommen (könnten) - nimm'
Code: Alles auswählen
sorted(filenames, key=lambda x: (os.path.splitext(x)[0], os.path.splitext(x)[1]))
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
preklov
***
Beiträge: 76 Registriert: Mo, 29.06.2009 09:04
Wohnort: Ruhrgebiet
Beitrag
von preklov » So, 21.02.2016 00:35
Herzlichen Dank. Das hatte ich aus den sorted-Beispielen so nicht erkannt. Dann reduziert sich mein ganzer Summs auf eine Zeile:
Code: Alles auswählen
return sorted(fileNames, key=lambda x: (os.path.splitext(x)[0].lower(), os.path.splitext(x)[1].lower()), reverse=down)
Schöne Grüße
Volker
Schöne Grüße
Volker
Karolus
********
Beiträge: 7521 Registriert: Mo, 02.01.2006 19:48
Beitrag
von Karolus » So, 21.02.2016 14:37
Hallo
Was steckt hinter `down` ??
IHMO solltest du das so schreiben:
Code: Alles auswählen
return sorted(filenames, key=lambda f: path.splitext(f.lower()) , reverse=True)
bzw. lagere
nur die Rückgabe in eine eigene Funktion aus, und verzichte auf das lambda:
Code: Alles auswählen
def sortkrit( p):
return path.splitext(p.lower())
....
sorted( filenames, key=sortkrit, reverse=True )
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
preklov
***
Beiträge: 76 Registriert: Mo, 29.06.2009 09:04
Wohnort: Ruhrgebiet
Beitrag
von preklov » So, 21.02.2016 15:15
Was steckt hinter `down` ??
Ein Funktionsparameter (s. OP).
lagere nur die Rückgabe in eine eigene Funktion aus, und verzichte auf das lambda
Klasse. Danke
Schöne Grüße
Volker