2012-03-03 8 views
7

Aparentemente, 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 ordenándoles que la misma carta como esta (antigua definición para el pedido sueco):Ordenar la lista de tuplas considerando la configuración regional (ordenamiento sueco)

  • Wa
  • Vb
  • Wc
  • Vd

que debería ser (nueva definición para el pedido sueco):

  • Vb
  • Vd
  • Wa
  • Wc

necesito pedir este correctamente para un sitio web de Python/Django que estoy construyendo. He intentado varias formas de simplemente pedir una lista de tuplas creadas a partir de un Django QuerySet utilizando * values_list *. Pero dado que es sueco, también las letras å, ä y ö deben ordenarse correctamente. Ahora tengo una u otra manera tanto no tanto ..

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 da:

########## 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 y una , ä, ö el pedido es correcto. Ser más preciso. Quiero Ordenando uno para respetar la configuración regional. Para entonces, usando el segundo elemento (identificación del objeto) en cada tupla, podría buscar 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 maneja mejor las intercalaciones y luego usar SQL sin procesar en Django?

+0

Creo que Postgres 8.4 y Ubuntu 10.04 LTS deberían estar bien.¿En qué configuración regional se configura su clúster? Puede decir esto con el comando "show lc_collate;" –

+0

Debería haber mencionado que la configuración regional era correcta para el clúster (sv_SE). Tuve que cambiar esto antes para que å, ä y ö se clasifiquen correctamente. – daru

Respuesta

8

Al ejecutar LC_ALL=sv_SE.UTF-8 sort en su ejemplo en Ubuntu-10.04, sale con Wa antes Vb (la "vieja forma"), por lo que Ubuntu no parece estar de acuerdo con la "nueva forma". Dado que PostgreSQL depende del sistema operativo para esto, se comportará de la misma manera que el sistema operativo que tiene el mismo lc_collate.

En realidad, hay un parche en glibc debian relacionado con este tema tipo particular: http://sourceware.org/bugzilla/show_bug.cgi?id=9724 embargo, se opuso a no aceptó. 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, crea tu propio entorno alternativo derivado de él para evitar jugar con el original.

+0

Parece que estaba tratando de resolver el problema en el lado equivocado de la pila que estoy usando. Tengo el control total del alojamiento así que no hubo ningún problema al usar ese parche. ¡Muchas gracias! – daru

0

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

Cambios desde 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) 
Cuestiones relacionadas