Seite 1 von 1

Sortieren einer Liste: Vergleich ab bestimmter Position

Verfasst: Dienstag 20. Januar 2015, 22:46
von portnoy
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?

Re: Sortieren einer Liste: Vergleich ab bestimmter Position

Verfasst: Dienstag 20. Januar 2015, 23:36
von /me
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.

Re: Sortieren einer Liste: Vergleich ab bestimmter Position

Verfasst: Mittwoch 21. Januar 2015, 08:13
von Sirius3
@/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)

Re: Sortieren einer Liste: Vergleich ab bestimmter Position

Verfasst: Mittwoch 21. Januar 2015, 09:01
von portnoy
Sehr schön, danke!