Ordenar lista de tuplas considerando locale (ordenamiento sueco)

Al parecer, PostgreSQL 8.4 y Ubuntu 10.04 no pueden manejar la forma actualizada de ordenar W y V para el alfabeto sueco. Es decir, todavía está ordenándolos con la misma letra como esta (antigua definición para pedidos suecos):

  • Washington
  • Vb
  • Baño
  • Enfermedad venérea

debería ser (nueva definición para pedidos suecos):

  • Vb
  • Enfermedad venérea
  • Washington
  • Baño

Necesito ordenar esto correctamente para un sitio web de Python / Django que estoy construyendo. He intentado varias formas de simplemente ordenar una lista de tuplas creadas a partir de un Django QuerySet usando * values_list *. Pero como es sueco, las letras å, ä y ö deben ordenarse correctamente. Ahora tengo una o la otra, no ambas.

list_of_tuples = [(u'Wa', 1), (u'Vb',2), (u'Wc',3), (u'Vd',4), (u'Öa',5), (u'äa',6), (u'Åa',7)] print '########## Ordering One ##############' ordered_list_one = sorted(list_of_tuples, key=lambda t: tuple(t[0].lower())) for item in ordered_list_one: print item[0] print '########## Ordering Two ##############' locale.setlocale(locale.LC_ALL, "sv_SE.utf8") list_of_names = [u'Wa', u'Vb', u'Wc', u'Vd', u'Öa', u'äa', u'Åa'] ordered_list_two = sorted(list_of_names, cmp=locale.strcoll) for item in ordered_list_two: print item 

Los ejemplos dan:

 ########## Ordering One ############## Vb Vd Wa Wc äa Åa Öa ########## Ordering Two ############## Wa Vb Wc Vd Åa äa Öa 

Ahora, lo que quiero es una combinación de estos para que tanto V / W como å, ä, ö sean correctos. Ser más preciso. Quiero que Ordering One respete locale. Al utilizar el segundo elemento (id de objeto) en cada tupla, podría obtener el objeto correcto en Django.

Estoy empezando a dudar de que esto sea posible? ¿Sería posible actualizar PostgreSQL a una versión más nueva que maneje mejor las intercalaciones y luego usar el SQL sin formato en Django?

Al ejecutar LC_ALL=sv_SE.UTF-8 sort en su ejemplo en Ubuntu-10.04, aparece Wa antes de Vb (la “forma antigua”), por lo que Ubuntu no parece estar de acuerdo con la “forma nueva”. Como PostgreSQL se basa en el sistema operativo para esto, se comportará de la misma manera que el sistema operativo dado el mismo lc_collate.

En realidad, hay un parche en debian glibc relacionado con este problema de clasificación en particular: http://sourceware.org/bugzilla/show_bug.cgi?id=9724 Pero fue rechazado y no fue aceptado. Si solo necesita este comportamiento en un sistema que administra, aún puede aplicar el cambio del parche a / usr / share / i18n / locales / sv_SE y reconstruir la configuración regional se_SV ejecutando locale-gen sv_SE.UTF-8 . O mejor aún, cree su propia ubicación alternativa derivada de la misma para evitar que se ensucie con el original.

Esta solución es compleja porque key = locale.strxfrm funciona bien con listas únicas y diccionarios, pero no con listas de listas o listas de tuplas.

Cambios de Py2 -> Py3: use locale.setlocale (locale.LC_ALL, ”) y key = ‘locale.strxfrm’ (en lugar de ‘cmp = locale.strcoll’).

 list_of_tuples = [('Wa', 1), ('Vb',2), ('Wc',3), ('Vd',4), ('Öa',5), ('äa',6), ('Åa',7)] def locTupSorter(uLot): "Locale-wise list of tuples sorter - works with most European languages" import locale locale.setlocale(locale.LC_ALL, '') # get current locale dicTups = dict(uLot) # list of tups to unsorted dictionary ssList = sorted(dicTups, key=locale.strxfrm) sLot = [] for i in range(len(ssList)): # builds a sorted list of tups tfLot = () elem = ssList[i] # creates tuples for list tfLot = (elem, dicTups[elem]) sLot.append(tfLot) # creates sorted list of tuples return(sLot) print("list_of_tuples=\n", list_of_tuples) sortedLot = locTupSorter(list_of_tuples) print("sorted list of tuples=\n",sortedLot)