sort() Umlaute und "_"-Zeichen...

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 22. Februar 2006, 15:15

Ich möchte eine sortierung einer Liste vornehmen. Dabei sollen alle mit "_" ganz oben landen. Das klappt damit schon mal ganz gut:

Code: Alles auswählen

        def spezial_cmp(a,b):
            """ Sortiert alle mit "_" beginnenen items nach oben """
            x = a[0][0] == "_" # x ist True wenn erste Buchstabe ein "_" ist
            y = b[0][0] == "_"
            if x and y: return 0
            if x: return -1
            if y: return 1
            return cmp(a,b)

        dirs.sort(spezial_cmp)
Was mich jetzt noch stört, sind die Umlaute... Ein "Ä" landet ziemlich weit unten und nicht bei "Ä"... Nun könnte ich noch ein paar IFs einbauen, aber ich denke das ist keine gut Variante... Was kann man tun?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Mittwoch 22. Februar 2006, 17:32

Such mal auf Google nach "lexikographischer Sortierung." Da siehst Du einige Vergleichs-Algorithmen die genau das für Dich machen, Python bringt sowas nicht selbst mit, also musst Du es im Endeffekt selbst implementieren.
--- Heiko.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 22. Februar 2006, 21:01

jens hat geschrieben:Was mich jetzt noch stört, sind die Umlaute... Ein "Ä" landet ziemlich weit unten und nicht bei "Ä"...
Hi Jens!

Vielleicht ist *strcoll* was du suchst. Habe es aber noch nicht ausprobiert.

http://python.org/doc/2.4.2/lib/module- ... l#l2h-2371

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 22. Februar 2006, 21:17

gerold hat geschrieben:Habe es aber noch nicht ausprobiert.
So, jetzt habe ich es aber ausprobiert. :-)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import locale

# Altes LC_COLLATE speichern
old_lc_collate = locale.setlocale(locale.LC_COLLATE)

# LC_COLLATE setzen
locale.setlocale(locale.LC_COLLATE, "german")

print locale.strcoll("ä", "b")
print locale.strcoll("ü", "v")
print locale.strcoll("_", "a")

# Wieder auf das alte LC_COLLATE umschalten
locale.setlocale(locale.LC_COLLATE, old_lc_collate)
Ergebnis:

Code: Alles auswählen

-1
-1
-1
"ä" kleiner als "b"
"ü" kleiner als "v"
"_" kleiner als "a"

Das kann sich sehen lassen. ;-)

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 22. Februar 2006, 22:11

Klappt hervorragend!

Komischerweise akzeptiert locale.strcoll() anders als cmp() keine tuple... cmp() nimmt einfach den ersten item aus dem tuple... Aber gut, das läßt sich einfach Lösen :)

Dank dir!

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten