#!/usr/bin/python -tt #======= #Crediti #======= # esercizi corso di python @ifac-cnr # Esercizi tratti liberamente da: # Google's Python Class # http://code.google.com/edu/languages/google-python-class/ # Copyright 2010 Google Inc. # Licensed under the Apache License, Version 2.0 # http://www.apache.org/licenses/LICENSE-2.0 #==================== #Indicazioni generali #==================== # RIEMPIRE LE FUNZIONI # DOVE COMPARE IL COMMENTO # +++METTI QUI IL TUO CODICE+++ """Testo mimato Creare le due funzioni - mimic_dict - mima_testo -------------------- mimic_dict(filename): -------------------- Accetta come parametro il nome di un file. Costruisce e restituisce un dizionario che associa ogni parola che appare nel file ad un elenco di tutte le parole che seguono immediatamente quella parola nel file stesso. La lista delle parole che seguono può essere in qualsiasi ordine e includere duplicati. Così ad esempio la parola "e" può avere come lista collegata ["poi", "migliore", "poi", "dopo", ...] cioè tutte le parole che vengono dopo "e" nel testo. NB: Per convenzione si assume la stringa vuota come la prima parola nel file. -------------------- funzione mima_testo: -------------------- restituisce una lista di parole di lunghezza specificata, mimando il testo rappresentato nel dizionario restituito dalla funzione mimic_dict. Data una generica parola, cercare quali parole potrebbero venire dopo, quindi sceglierne una a caso e ripetere la procedura fino a che non si raggiunge il numero di parole specificato. Utilizzare la stringa vuota come prima parola. Se la funzione si blocca perché trova una parola che non è in una delle liste contenute nel dizionario, tornare alla stringa vuota. Note: ----- il modulo standard 'random' di Python include una random.choice(elenco), che restituisce un elemento casuale da una lista non vuota. """ import random import sys def mimic_dict1(filename): ##-INIZIO-SOLUZIONE-## #leggo il file, lo divido in parole e lo chiudo myfl = open(filename) words = myfl.read().split() myfl.close() #inizializzo il dizionario con la prima parola (che ha per chiave la stringa vuota) #assunta come prima parola 'virtuale' md = {'':[words[0]]} #itero sulle parole: # - itero fino alla penultima parola # - se la parola è una chiave, appendo la parola che segue a m[w] # - se la parola w non è una chiave: # inizializzo il valore del dizionario md[w] # come lista che contiene la parola che segue for i,w in enumerate(words[:-1]): if w in md: md[w].append(words[i+1]) else: md[w]=[words[i+1]] #restituisco il dizionario return md ##-FINE-SOLUZIONE-## ##-INIZIO-OPZIONALE-## def mimic_dict2(filename): mimic_dict = {} #leggo il file tutto in una stringa f = open(filename, 'r') text = f.read() f.close() #divido il testo in parole words = text.split() #inizializzo la parola precedente come la stringa vuota prev = '' #itero su tutte le parole for word in words: #se la parola precedente non è una chiave #inizializza la lista mimic_dict[prev] con la parola corrente if not prev in mimic_dict: mimic_dict[prev] = [word] #altrimenti appendi la parola corrente alla lista else: mimic_dict[prev].append(word) # si poteva anche scrivere # mimic_dict[prev] = mimic_dict.get(prev, []) + [word] #aggiorno la parola precedente per il prossimo passo prev = word return mimic_dict ##-FINE-OPZIONALE-## def mima_testo1(mimic_dict, word, n=200): ##-INIZIO-SOLUZIONE-## """dato il dizionario di partenza, la parola (chiave) iniziale ed il numero di parole n restituisce ... """ words = [] while len(words) < n : #se word è una key del dizionario if word in mimic_dict: word = random.choice(mimic_dict[word]) words.append(word) #altrimenti riparto dalla stringa vuota else: word = '' return words ##-FINE-SOLUZIONE-## ##-INIZIO-OPZIONALE-## def mima_testo2(mimic_dict, word, n=200): #inizializzo il testo da restituire words = [] # itero n volte for unused_i in range(n): nexts = mimic_dict.get(word) # Restituisce None se word non e' nel dizionario if not nexts: nexts = mimic_dict[''] # se nexts e' None, 'ritorna' alla stringa vuota come chiave #in ogni caso scelgo la parola da aggiungere ... word = random.choice(nexts) #... e la aggiungo al testo da re words.append(word) return words ##-FINE-OPZIONALE-## #============= #FINE ESERCIZI #============= # NON MODIFICARE DA QUI IN POI!!!!!!!! # usa mimic_dict() e mima_testo() def main(): #nessun argomento passato da riga di comando if len(sys.argv) != 2: mdict = mimic_dict1('./testo_prova_dict1.txt') print('Versione 1') print(mima_testo1(mdict, '')) ##-INIZIO-OPZIONALE-## print('Versione 2') print(mima_testo2(mdict, '')) ##-FINE-OPZIONALE-## #nome del file passato come argomento da riga di comando else: #è possibile verificare che versione 1 e 2 #di mimic_dict sono equivalenti mdict = mimic_dict(sys.argv[1]) print('Versione 1') print(mima_testo1(mdict, '')) ##-INIZIO-OPZIONALE-## print('Versione 2') print(mima_testo2(mdict, '')) ##-FINE-OPZIONALE-## if __name__ == '__main__': main()