Hallo. Ich wende mich ans Forum mit einer absoluten Anfängerfrage, die ich aber mit Hilfe der SuFu nicht gelöst bekommen.
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.
locale.setlocale für den Vergleich zweiter Unicodes nutzen
- b.esser-wisser
- User
- Beiträge: 272
- Registriert: Freitag 20. Februar 2009, 14:21
- Wohnort: Bundeshauptstadt B.
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:
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:
Die Schlechte Nachricht ist: man kann unicode-zeichen nicht eindeutig sortieren.
Und da im Python-zen (">>>import this") steht:
(Sinngemäß übersetzt: "Du sollst nicht raten"), gibt es keine Standardsortierung.Tim Peters hat geschrieben:[...]
In the face of ambiguity, refuse the temptation to guess.
[...]
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
Besten Dank für diese Anregungen. Aus Deinen Vorschlägen kann ich mir eine Lösung meines Problems ableiten.
Eins ist mir allerdings noch nicht klar:
Du schriebst, man könne...
Eins ist mir allerdings noch nicht klar:
Du schriebst, man könne...
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? :Kunicode-zeichen nicht eindeutig sortieren.