#!/usr/bin/python -tt # Copyright 2010 Google Inc. # Licensed under the Apache License, Version 2.0 # http://www.apache.org/licenses/LICENSE-2.0 """Esercizio Conta le parole Il main () sotto è già definito e completo ed usa le funzioni print_words() print_top() che sono da implementare. -------------------------- print_words(nome del file) -------------------------- conta la frequenza con cui ogni parola compare nel file di testo specificato come parametro e stampa: word1 count1 word2 count2 ... Stampare l'elenco riportato sopra in modo ordinato per parola (ordine alfabetico). Fare in modo che maiuscole e minuscole NON contino, cosi 'La' e 'la' contano come una sola parola ripetuta due volte. -------------------------- print_top(nome del file,n) -------------------------- è simile a print_words (), ma stampa solo le prime n parole più comuni ordinate per numero in modo che la parola più comune compaia per prima. Suggerimenti: ------------- - usare un dizionario {parola:conteggio} - Utilizzare str.split() (nessun argomento) per dividere il file in parole (separando con gli spazi). - definire una funzione di supporto al fine di evitare la duplicazione del codice all'interno di print_words () e print_top (). Flusso di lavoro: ----------------- non costruire l'intero programma in una sola volta. Porsi dei risultati intermedi ed andare avanti solo quando questi sono raggiunti. Soluzioni: ---------- nel caso di opzione --count le prime righe dell'output sono le seguenti: .net. , 1 agli , 1 all'integrazione , 1 allo , 1 altre , 1 altri , 1 amiga, , 1 anche , 2 approvata , 1 aumento , 1 cellulari , 1 che , 1 codice , 1 commerciali. , 1 con , 2 confermare , 1 dalla , 1 di , 6 dinamico , 1 distribuito , 1 e , 7 nel caso di opzione --topcount le righe dell'output sono le seguenti: e , 7 di , 6 python , 5 è , 5 un , 3 per , 2 anche , 2 molti , 2 con , 2 sviluppo , 2 linguaggio , 2 il , 2 allo , 1 leggi , 1 linux/unix, , 1 utilizzo , 1 portato , 1 estesa , 1 nokia; , 1 può , 1 """ import sys # +++METTI QUI IL TUO CODICE+++ # Definisci le due funzioni: # - print_words(nome del file) # - print_top(nome del file,n) # descritte sopra. # Valuta se scrivere una funzione di utilità che legge un file # E costruisce e restituisce un dizionario {parola : conteggio} per quel file. # Poi print_words() e print_top() possono chiamare la funzione di utilità. ##-INIZIO-OPZIONALE-## def wordcount_dict(filename): """ Crea un dizionario {parola : conteggio} per il file il cui nome è specificato come parametro Fa in modo che maiuscole e minuscole NON contino, cosi 'La' e 'la' contano come una sola parola ripetuta due volte.""" #apro il file leggo tutto in una riga e chiudo myfl = open(filename) mystr = myfl.read() myfl.close() #divido il testo in parole words = mystr.split() #creo il dizionario {parola:contatore} wc_dict = {} for W in words: w=W.lower() if w not in wc_dict: #test sulle chiavi wc_dict[w] = 1 else: wc_dict[w] += 1 return wc_dict ##-FINE-OPZIONALE-## # print_words(filename) # --------------------- def print_words(filename): """ conta la frequenza con cui ogni parola compare nel file il cui nome è specificato come parametro e stampa: word1 count1 word2 count2 ... Stampa la lista in modo ordinato per parola (per python la punteggiatura viene prima delle lettere - che va bene). """ ##-INIZIO-SOLUZIONE-## wc_dict = wordcount_dict(filename) for w in sorted(wc_dict.keys()): print(w,',',wc_dict[w]) return ##-FINE-SOLUZIONE-## ##-INIZIO-OPZIONALE-## def last(seq): return seq[-1] ##-FINE-OPZIONALE-## def print_top(filename,n=20): """ simile a print_words (), ma stampa solo le prime n parole più comuni ordinate in modo che la parola più comune sia la prima. """ ##-INIZIO-SOLUZIONE-## wc_dict = wordcount_dict(filename) for w,c in sorted(wc_dict.items(),key=last,reverse=True)[:n]: print(w,',',c) ##-FINE-SOLUZIONE-## #============= #FINE ESERCIZI #============= # NON MODIFICARE DA QUI IN POI!!!!!!!! def main(): if len(sys.argv) == 3: option = sys.argv[1] filename = sys.argv[2] else: filename = 'testo_prova_dict1.txt' option = input('Opzione (--count o --topcount)\n') if option == '--count': print_words(filename) elif option == '--topcount': print_top(filename) else: print('unknown option: ' + option) return if __name__ == '__main__': main()