Python tipo personalizado

Tengo una pregunta: esta es una lista de listas, formada por la biblioteca ElementTree.

[['word1', ], ['word2', ], ['word3', ], ['word4', ]] 

word1..4 puede contener caracteres Unicode, es decir (â, ü, ç).

Quiero ordenar esta lista de listas por mi alfabeto personalizado.

Sé cómo ordenar por alfabeto personalizado desde aquí ordenar palabras en python

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

El problema es que no pude encontrar la manera de aplicar estos dos métodos para ordenar mi “lista de listas”.

Tu primer enlace más o menos resuelve el problema. Solo necesita que la función lambda mire el primer elemento de su 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á clasificando una lista razonablemente grande, es cambiar la estructura del alfabeto en un dict primero, para que la búsqueda de índices 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]]) 

Si te estoy entendiendo correctamente, quieres saber cómo aplicar la técnica de clasificación de claves cuando la clave debe aplicarse a un elemento de tu objeto. En otras palabras, desea aplicar la función de tecla a ‘wordx’, no al elemento [‘wordx’, …] que está clasificando. En ese caso, puedes 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 usando el estilo en tu 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 se ordenará en su lugar, modificando su lista. ordenado (my_list, …) devolverá una nueva lista ordenada.

¡¡¡Funciona genial!!! Gracias por su ayuda Esta es mi historia: Tengo el diccionario turco-ruso en formato xdxf. El problema era arreglarlo. He encontrado la solución aquí http://effbot.org/zone/element-sort.htm pero no ordenó los caracteres Unicode. Aquí está el código fuente final:

 #!/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") 

contenido de muestra de dict.xml

   âdef1 adef1 gdef1 wdef1 ndef1 udef1 üdef1 âbdef1 çdef1 vdef1 acdef1   

Gracias a todos