locale.setlocale für den Vergleich zweiter Unicodes nutzen

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
kutya
User
Beiträge: 2
Registriert: Sonntag 19. April 2009, 22:53

Sonntag 19. April 2009, 23:03

Hallo. Ich wende mich ans Forum mit einer absoluten Anfängerfrage, die ich aber mit Hilfe der SuFu nicht gelöst bekommen.:oops:

Ich nutze locale.setlocale(locale.LC_ALL,'') um eine Liste mit deutschen Unicodes alphabetisch sortiert zu bekommen. Das klappt auch soweit ganz gut. Ein wenig später geht es mir dann um einen direkten Vergleich zweier Unicodes mittels des "größer als"-Zeichens (if schriftzug1 > schriftzug2:).

Nun stellt sich mir die Frage, wie diesen Vergleich so hinbekomme, dass er ebenfalls das deutsche Alphabet berücksichtigt.

:?:
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Montag 20. April 2009, 12:24

Die Gute Nachricht ist: das ist keine Anfängerfrage
Die Schlechte Nachricht ist: man kann unicode-zeichen nicht eindeutig sortieren.
Und da im Python-zen (">>>import this") steht:
Tim Peters hat geschrieben:[...]
In the face of ambiguity, refuse the temptation to guess.
[...]
(Sinngemäß übersetzt: "Du sollst nicht raten"), gibt es keine Standardsortierung.
Du musst also selber sortieren - am besten über den Parameter"key=" von list.sort() bzw. sorted() und z.B. einem dict(u"A"=0, u"Ä"=???).
Es gibt noch "locale.strcoll()": das kann man als "cmp="-Parameter beim sortieren verwenden - dabei ergibt sich aber keine "Telefonbuch"-Sortierung

hth, Jörg
Edit: Ich bin davon ausgegangen, dass du die "Lexikon"- oder "Telefonbuch"-Sortierung (s.. wiki-Link) suchst - sonst geht natürlich "[u"A", u"z", u"Ä", u"ß"].sort()"
Edit II:
Für deutschen Text ist es einfacher als ich dachte:

Code: Alles auswählen

#!
# coding:utf-8
import itertools as it
from functools import partial
LEX_SORT = {u"Ä":u"A", u"Ö":u"O", u"Ü":u"U",
            u"ä":u"a", u"ö":u"o", u"Ü":u"ü", u"ß":u"s",}
PHONEBK_SORT = {u"Ä":u"AE",u"Ö":u"OE",u"Ü":u"UE",
            u"ä":u"ae", u"ö":u"oe", u"ü":u"ue", u"ß":u"ss",}
            
def rate_text(text, replacements = PHONEBK_SORT):
    return "".join(replacements.get(c,c) for c in text)
if __name__ == "__main__":
    examples = [u"Götz", u"Göbel", u"Goethe", u"Goldmann"]
    for test_case, name in ((examples,"original"),
                 (sorted(examples),"builtin sort"),
                 (sorted(examples, key=rate_text),"phonebook style"),
                 (sorted(examples, key=partial(rate_text, replacements=LEX_SORT) ),
                    "dictionary style")):
        print name
        for word in test_case:
            print word
        print
kutya
User
Beiträge: 2
Registriert: Sonntag 19. April 2009, 22:53

Mittwoch 22. April 2009, 17:25

Besten Dank für diese Anregungen. Aus Deinen Vorschlägen kann ich mir eine Lösung meines Problems ableiten. :D

Eins ist mir allerdings noch nicht klar:

Du schriebst, man könne...
unicode-zeichen nicht eindeutig sortieren.
Wenn ich Deine Anregungen richtig verstehe, löst Du dieses Problem, in dem Du die Arbeitsweise der Funktion sort() entsprechend anpasst. Wäre dies auch für den direkten "größer als"- und "kleiner als"-Vergleich möglich? :K
Antworten