Sortieren einer Liste: Vergleich ab bestimmter Position

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
portnoy
User
Beiträge: 2
Registriert: Dienstag 20. Januar 2015, 22:31

Hallo,

ich habe mit fnmatch eine Auflistung der Dateien in diversen Verzeichnissen erstellt.
Diese ist zuerst nach Verzeichnis und dann nach den enthaltenen Dateien sortiert.
Ich will, daß die Liste nur nach den Dateien geordnet ist. Da die Pfadnamen immer die gleiche Länge haben, könnte man sagen: Beginne den Vergleich nicht am ersten Char des Listeneintrages sondern am nten. Habe das im Moment so gelöst, daß ich die Dateinamen (alle gleichlang und eindeutig) als Präfix vor die Listeneinträge gesetzt habe und dann sortiert habe, danach habe ich die Präfixe wieder gelöscht.
Geht das auch eleganter?
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

portnoy hat geschrieben:Geht das auch eleganter?
Listen bieten eine sort-Methode. Die sort-Methode bietet die Möglichkeit einen key für das Sortieren anzugeben. Jetzt brauchen wir für den key nur noch noch eine Funktion, die den Pfad passend zerlegt und finden sie in os.path.split. Von deren Ergebnis nehmen wir jetzt noch das letzte Element ([-1]).

Code: Alles auswählen

>>> import os
>>> filenames = [
    '/home/matthias/whatsthis.txt',
    '/etc/apache2/listen.conf',
    '/usr/lib/dconf-service'
]
>>> filenames.sort(key=lambda x: os.path.split(x)[-1])
>>> print(filenames)
['/usr/lib/dconf-service', '/etc/apache2/listen.conf', '/home/matthias/whatsthis.txt']
Wenn man lambdas nicht gewohnt ist sieht es erst einmal tricky aus, aber eigentlich ist es ganz simpel.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@/me: statt os.path.split sei hier os.path.basename erwähnt, dann kann man sich auch das lambda sparen:

Code: Alles auswählen

filenames.sort(key=os.path.basename)
portnoy
User
Beiträge: 2
Registriert: Dienstag 20. Januar 2015, 22:31

Sehr schön, danke!
Antworten