Seite 1 von 1

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

Verfasst: Mittwoch 22. Februar 2006, 15:15
von jens
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?

Verfasst: Mittwoch 22. Februar 2006, 17:32
von modelnine
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.

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

Verfasst: Mittwoch 22. Februar 2006, 21:01
von gerold
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
:-)

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

Verfasst: Mittwoch 22. Februar 2006, 21:17
von gerold
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
:-)

Verfasst: Mittwoch 22. Februar 2006, 22:11
von jens
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!