2012-05-18 12 views
6

Tengo una pregunta: Esta es la lista de las listas, formadas por la biblioteca ElementTree.Tipo personalizado python

[['word1', <Element tag at b719a4cc>], ['word2', <Element tag at b719a6cc>], ['word3', <Element tag at b719a78c>], ['word4', <Element tag at b719a82c>]] 

word1..4 pueden contener caracteres unicode i.e (â, ü, ç).

Quiero ordenar esta lista de listas por mi alfabeto personalizado.

sé cómo ordenar por orden alfabético personalizado desde aquí sorting words in python

También sé cómo ordenar por la clave de aquí http://wiki.python.org/moin/HowTo/Sorting

El problema es que no pude encontrar la manera de cómo aplicar estos dos métodos para ordenar mi "lista de listas".

+1

pregunta Bien, si usted suministró suficiente código que podríamos ejecutarlo apuesto a alguien solo publique una solución completa (especialmente si publica lo que ha intentado). –

+0

Estoy de acuerdo con Brian, agregue un código que podamos copiar y pegar, y probablemente le tome a alguien menos de 5 minutos escribir una respuesta que funcione correctamente. –

+0

¡Hola! Tengo un problema más. ¿Cómo hacer que la clasificación ** no distinga entre mayúsculas y minúsculas **? – microspace

Respuesta

13

Su primer enlace resuelve más o menos el problema. Usted sólo tiene que tener la función lambda sólo se mira el primer elemento de la lista:

alphabet = "zyxwvutsrqpomnlkjihgfedcba" 

new_list = sorted(inputList, key=lambda word: [alphabet.index(c) for c in word[0]]) 

Una modificación que podría sugerir, si estás ordenar una lista bastante grande, es cambiar la estructura alfabeto en un diccionario primero, para que la búsqueda del índice sea más rápida:

alphabet_dict = dict([(x, alphabet.index(x)) for x in alphabet) 
new_list = sorted(inputList, key=lambda word: [alphabet_dict[c] for c in word[0]]) 
2

Si lo entiendo bien, quiere saber cómo aplicar la técnica de clasificación de claves cuando la clave se debe aplicar a un elemento de su objeto. En otras palabras, desea aplicar la función clave a 'wordx', no al elemento ['wordx', ...] que está clasificando realmente. En ese caso, se puede hacer esto:

my_alphabet = "..." 

def my_key(elem): 
    word = elem[0] 
    return [my_alphabet.index(c) for c in word] 

my_list.sort(key=my_key) 

o utilizando el estilo en su primer enlace:

my_alphabet = "..." 
my_list.sort(key=lambda elem: [my_alphabet.index(c) for c in elem[0]]) 

Tenga en cuenta que my_list.sort clasificará en su lugar, tener que modificar su lista. sorted (my_list, ...) devolverá una nueva lista ordenada.

+0

Sí, me entendiste correctamente. ¡Gracias! Ahora entiendo. – microspace

0

Funciona muy bien !!! Gracias por su ayuda. Aquí está mi historia: Tengo el diccionario turco-ruso en formato xdxf. el problema era ordenarlo. Encontré una solución aquí http://effbot.org/zone/element-sort.htm pero no clasificó caracteres Unicode. aquí es el código fuente final: contenido

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import xml.etree.ElementTree as ET 
import codecs 
alphabet = u"aâbcçdefgğhiıjklmnoöpqrstuüvwxyz" 
tree = ET.parse("dict.xml") 
# this element holds the phonebook entries 
container = tree.find("entries") 
data = [] 
for elem in container: 
    keyd = elem.findtext("k") 
    data.append([keyd, elem]) 
data.sort(key=lambda data: [alphabet.index(c) for c in data[0]]) 
container[:] = [item[-1] for item in data] 
tree.write("new-dict.xml", encoding="utf-8") 

muestra de dict.xml

<cont> 
    <entries> 
<ar><k>â</k>def1</ar> 
<ar><k>a</k>def1</ar> 
<ar><k>g</k>def1</ar> 
<ar><k>w</k>def1</ar> 
<ar><k>n</k>def1</ar> 
<ar><k>u</k>def1</ar> 
<ar><k>ü</k>def1</ar> 
<ar><k>âb</k>def1</ar> 
<ar><k>ç</k>def1</ar> 
<ar><k>v</k>def1</ar> 
<ar><k>ac</k>def1</ar> 
    </entries> 
</cont> 

Gracias a todos

+0

Mmm. Tengo un problema más. ¿Cómo hacer que sea menos sensible a mayúsculas y minúsculas? – microspace

Cuestiones relacionadas