#import locale import functools #from unicodedata import normalize def sin_puntos(cadena): # devuelve una cadena sin los puntos de la h aspirada # y ch vaqueira eliminándolos directamente # ch vaqueira cadena=cadena.replace("l.l","ll").replace("ḷḷ","ll") cadena=cadena.replace("L.l","Ll").replace("Ḷḷ","Ll") cadena=cadena.replace("L.L","LL").replace("ḶḶ","LL") cadena=cadena.replace("l.L","lL").replace("ḷḶ","lL") # h aspirada for h in "hH": for vocal in "aeiouáéíóúAEIOUÁÉÍÓÚ": # no puede ser con ü cadena=cadena.replace(h+"."+vocal,h+vocal) for h,h_punto in zip("hH","ḥḤ"): for vocal in "aeiouáéíóúAEIOUÁÉÍÓÚ": # no puede ser con ü cadena=cadena.replace(h_punto+vocal,h+vocal) return cadena def sin_acentos(cadena): # devuelve una cadena sin acentos ni diéresis sustituyéndolos # por sus equivalentes sin acentos con="áéíóúüÁÉÍÓÚÜ" sin="aeiouuAEIOUU" for acento,no_acento in zip(con,sin): cadena=cadena.replace(acento,no_acento) return cadena def reemplaza_h_y_ll(cadena): # cambia todas las variantes de h. por ḥ y l. por ḷ # ch vaqueira cadena=cadena.replace("l.l","ḷḷ") cadena=cadena.replace("L.l","Ḷḷ") cadena=cadena.replace("L.L","ḶḶ") cadena=cadena.replace("l.L","ḷḶ") # h aspirada for h,h_punto in zip("hH","ḥḤ"): for vocal in "aeiouáéíóúAEIOUÁÉÍÓÚ": # no puede ser con ü cadena=cadena.replace(h+"."+vocal,h_punto+vocal) return cadena def compara_cosmetica(cadena_1,cadena_2): # compara dos cadenas suponiendo que las diferencias # son cosméticas y que basta con seguir el orden # habitual de los diccionarios, por ejemplo "villa"/"Villa" # "paso"/"pasó" "llena"/"L.lena"/"Ḷḷ" orden=" aAáÁbBcCçÇdDeEéÉfFgGhHḥḤiIíÍjJkKlLḷḶ" orden+="mMnNñÑoOóÓpPqQrRsStTuUúÚüÜvVwWxXyYzZ" def indice(caracter): if caracter in orden: # es una letra contenida en la cadena de letras ordenadas return orden.find(caracter) else: # es un carácter raro return len(orden)+1 # se limpian de puntos cambiando por sus equivalentes con puntos abajo cadena_1=reemplaza_h_y_ll(cadena_1) cadena_2=reemplaza_h_y_ll(cadena_2) ## if len(cadena_1)!=len(cadena_2): ## # no puede ser, se supone que eran diferencias cosméticas ## mensaje="la cadena '"+cadena_1+"' y la '"+cadena_2+"'" ## mensaje+=" deberían ser de la misma longitud y tener" ## mensaje+=" solo diferencias cosméticas" ## raise Exception(mensaje) # se añaden espacios hasta que sean iguales en longitud mayor_longitud=max(len(cadena_1),len(cadena_2)) cadena_1=cadena_1+(mayor_longitud-len(cadena_1))*" " cadena_2=cadena_2+(mayor_longitud-len(cadena_2))*" " # comparación carácter a carácter for i in range(len(cadena_1)): if indice(cadena_1[i]) < indice(cadena_2[i]): # la primera cadena es menor que la segunda return -1 if indice(cadena_1[i]) > indice(cadena_2[i]): # la primera cadena es mayor que la segunda return 1 # son iguales letra a letra return 0 def compara(cadena_1,cadena_2): # compara dos palabras que contienen incialmente solo letras # en asturiano (incluyendo la h aspirada y la ch vaqueira # así como acentos, diéresis, mayúculas y minúsculas y # devuelve -1 (menor la primera), 0 (iguales), 1 (mayor) # son dos cadenas exactamente idénticas if cadena_1==cadena_2: return 0 # elimina puntos, acentos y mayúsculas c_1=sin_puntos(sin_acentos(cadena_1)).lower() c_2=sin_puntos(sin_acentos(cadena_2)).lower() if c_1==c_2: # hay solo diferencias cosméticas (acentos, mayúsculas, etc...) # debiendo emplearse entonces el orden habitual de los diccionarios return compara_cosmetica(cadena_1,cadena_2) # diferencias profundas, hay que comparar a fondo empleando c_1 y c_2 # que tienen claros caracteres diferentes return compara_cosmetica(c_1,c_2) def ordena(lista): ## # se fija como lengua es_ES para que entre la ñ ## # también vale ast_ES ## # no funciona correctamente si hay h., l.l y demás ## locale.setlocale(locale.LC_ALL,("es_ES","utf-8")) ## return sorted(lista,key=functools.cmp_to_key(locale.strcoll)) # comparación teniendo en cuenta h., l.l y demás return sorted(lista,key=functools.cmp_to_key(compara)) if __name__ == "__main__": # pruebas resultado=compara_cosmetica("alḥÉxyzl.LO","Alh.éxYZL.ló") resultado=compara_cosmetica("alḥéxyzl.lO","alh.éxyzl.ló") print(resultado) cadena="l.Lena H.águera neñu Ḷḷena Ḥo ḥoguera" x=sin_puntos(cadena) y=sin_acentos(x) print(cadena) print(x) print(y) lista=["llena","l.lena","hoguera","h.oguera","ḷḷena","ḥoguera"] lista=ordena(lista) print(lista) lista="ale ále alé álé Ále Ale Alé Álé alE álE alÉ álÉ AlE ÁlE AlÉ ÁlÉ".split() lista=ordena(lista) print(lista) lista="hoguera Hoguera h.oguera H.oguera ḥoguera Ḥoguera hóguera " lista+="Hóguera h.óguera H.óguera ḥóguera Ḥóguera" lista=lista.split() lista=ordena(lista) print(lista) lista="llena Llena LLena l.lena L.lena LLena ḷḷena Ḷḷena ḶḶena " lista+="ḷḶena lléna Lléna LLéna l.léna L.léna LLéna ḷḷéna Ḷḷéna " lista+="ḶḶéna ḷḶéna" lista=lista.split() lista=ordena(lista) print(lista) lista="atontonar atontorolar átonu atoñada atoñar".split() print(lista) lista=ordena(lista) print(lista) lista="haploloxía haplolóxicu h.archa harén".split() print(lista) lista=ordena(lista) print(lista) lista="harpía harúspiz hasta hastial h.ausa hausa h.awaianu " lista+="h.axís haxografía haxográficu haxógrafu haxotopónimu " lista+="haza h.e hebraicu" lista=lista.split() print(lista) lista=ordena(lista) print(lista)