Sortierung von strings mit Umlauten

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
JuSt611
User
Beiträge: 2
Registriert: Samstag 6. Oktober 2012, 15:48

Hallo,

leider bin ich noch nicht sehr erfahren in Python. Deshalb habe ich mit Google, Manual und Forumssuche keine Lösung für folgendes Problem gefunden: Wie kann ich eine solche Liste sortieren, so dass die Umlaute korrekt berücksichtigt werden:

Code: Alles auswählen

 countries = ['\xc3\x96sterreich','Deutschland','D\xc3\xa4nemark','Ungarn'] 
countries.sort() ergibt die Reihenfolge ['Deutschland', 'D\xc3\xa4nemark', 'Ungarn', '\xc3\x96sterreich']

Die hex strings wurden durch die Lokalisierung automatisch aus den ursprünglich mit Umlauten vorhandenen strings erzeugt.

Gruß
JuSt
CasualCoding.org

Ich vermute, da wirst du dir eine eigene Funktion oder Methode schreiben müssen, die das erledigt.
anymagical
User
Beiträge: 33
Registriert: Montag 2. April 2012, 15:34

Hallo,

eine möglichkeit wäre es die Umlaute durch die entsprechenden Buchstabenkombinationen zu ersetzen. Da Ä,Ö und Ü werden immer nach dem 'Z' angezeigt.

Falls es darum geht die Länder einzugeben und auf den Komfort des Ä Ö und Ü nicht verzichtet werden soll, könnte man eine Funktion schreiben welche die Hexzahl durch ihre entsprechenden Buchstabenkombinationen ersetzt.

Vielleicht hat jemand der Pythonpro's noch einen guten Rat parat :)

Gruß
Anymagical
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Code: Alles auswählen

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
'de_DE'
>>> countries = ['\xc3\x96sterreich','Deutschland','D\xc3\xa4nemark','Ungarn']
>>> sorted([i.decode('utf8') for i in countries], cmp=locale.strcoll)
[u'D\xe4nemark', u'Deutschland', u'\xd6sterreich', u'Ungarn']
JuSt611
User
Beiträge: 2
Registriert: Samstag 6. Oktober 2012, 15:48

Herzlichen Dank, jerch.

Ich habe mit Deiner Lösung noch mal gesucht und daraus diese vereinfachte Variante entwickelt:

Code: Alles auswählen

import locale
locale.setlocale(locale.LC_ALL, 'de_DE')
countries = ['\xc3\x96sterreich','Deutschland','D\xc3\xa4nemark','Ungarn']
countries.sort(key=locale.strxfrm)
print countries
['D\xc3\xa4nemark', 'Deutschland', '\xc3\x96sterreich', 'Ungarn']
Allerdings hatte ich mein Problem in der Fragestellung vereinfacht dargestellt. Tatsächlich möchte ich eine Liste von Listen sortieren. Das habe ich so gelöst (inkl. lunars Tipp, vielen Dank):

Code: Alles auswählen

import locale
#from operator import itemgetter 
locale.setlocale(locale.LC_ALL, 'de_DE')
countries = [['\xc3\x96sterreich',1],['Deutschland',2],['D\xc3\xa4nemark',3],['Ungarn',4]]
#countries = sorted(countries, key=itemgetter(0), cmp=locale.strcoll)
countries.sort(key=lambda i: locale.strxfrm(i[0]))
print countries
[['D\xc3\xa4nemark', 3], ['Deutschland', 2], ['\xc3\x96sterreich', 1], ['Ungarn', 4]] 
Gruß
JuSt
Zuletzt geändert von JuSt611 am Sonntag 7. Oktober 2012, 12:02, insgesamt 2-mal geändert.
lunar

Code: Alles auswählen

countries.sort(key=lambda i: locale.strxfrm(i[0]))
Das "cmp"-Argument ist veraltet, und sollte nicht mehr verwendet werden.
Antworten