''' Es 11: 3 punti progettare la funzione es11(ftesto) che, preso in input l'indirizzo di un file di testo restituisce un dizionario avente per chiavi delle stringhe ed attributo liste di stringhe. Il file di testo contiene stringhe distinte di caratteri, si guardi ad esempio il file f9.txt. Le chiavi del dizionario si ottengono dalle stringhe presenti nel file dopo aver eliminato da queste le vocali ed aver riordinato lessicograficamente i caratteri rimanenti (ad esempio dalla stringa 'angelo' si ottine la chiave 'gln'). Attributo della chiave e' la lista contenente le stringhe del file che l'hanno generata. Nota che stringhe diverse possono generare una stessa chiave come nel caso di 'casa', 'caso' e 'cose' Le stringhe nella lista devono comparire ordinate per lunghezza decrescente, a parita' di lunghezza, lessicograficamente. Ad Esempio, per il file di testo f10.txt la funzione restituisce il dizionario: {'prt': ['parto', 'porta'], 'r': ['era', 'ora'], 'pr': ['arpia', 'arpa'], 'cs': ['casa', 'cosa'], 'fll': ['follia', 'fallo', 'folla'], 'rt': ['otre', 'tre'], 'lp': ['piolo', 'polo'] } ''' def es11(ftesto): dizionario = genera_dizionario(ftesto) ordina_liste(dizionario) return dizionario # per costruire il dizionario: # generiamo il dizionario dalle parole del file # ordiniamo le liste # torniamo il dizionario # per generare il dizionario # si inizia con un dizionario vuoto # apriamo il file # per ogni riga del file # tolgo accapo/spazi # tolgo le vocali # ordino le consonanti rimaste # se la chiave รจ presente aggiungo la parola a quella lista # altrimenti aggiungo chiave -> [parola] # torno il dizionario def genera_dizionario(filename): dizionario = {} with open(filename, encoding='utf8') as F: for riga in F: parola = riga.strip() if parola: chiave = parola for vocale in 'aeiouAEIOU': chiave = chiave.replace(vocale, '') ordinata = sorted(chiave) chiave = ''.join(ordinata) if chiave in dizionario: dizionario[chiave].append(parola) else: dizionario[chiave] = [parola] return dizionario def coppia_len_parola(parola): return -len(parola), parola # per ordinare le liste del dizionario # per ogni valore del dizionario # lo ordino per lunghezza decrescente e in ordine alfabetico def ordina_liste(dizionario): for lista in dizionario.values(): lista.sort(key=coppia_len_parola)