|
| 1 | +\documentclass[11pt,a4]{article} |
| 2 | + |
| 3 | +\usepackage[margin=2cm]{geometry} |
| 4 | + |
| 5 | +\usepackage{amsmath} |
| 6 | +\usepackage{url} |
| 7 | + |
| 8 | +\usepackage{amsmath} |
| 9 | +\usepackage{url} |
| 10 | + |
| 11 | +\usepackage[utf8]{inputenc} |
| 12 | + |
| 13 | +% Default fixed font does not support bold face |
| 14 | +\DeclareFixedFont{\ttb}{T1}{txtt}{bx}{n}{10} % for bold |
| 15 | +\DeclareFixedFont{\ttm}{T1}{txtt}{m}{n}{10} % for normal |
| 16 | + |
| 17 | +% Custom colors |
| 18 | +\usepackage{color} |
| 19 | +\definecolor{deepblue}{rgb}{0,0,0.5} |
| 20 | +\definecolor{deepred}{rgb}{0.6,0,0} |
| 21 | +\definecolor{deepgreen}{rgb}{0,0.5,0} |
| 22 | + |
| 23 | +\usepackage{listings} |
| 24 | + |
| 25 | +% Python style for highlighting |
| 26 | +\newcommand\pythonstyle{\lstset{ |
| 27 | +language=Python, |
| 28 | +basicstyle=\ttm, |
| 29 | +otherkeywords={self}, % Add keywords here |
| 30 | +keywordstyle=\ttb\color{deepblue}, |
| 31 | +emph={MyClass,__init__}, % Custom highlighting |
| 32 | +emphstyle=\ttb\color{deepred}, % Custom highlighting style |
| 33 | +stringstyle=\color{deepgreen}, |
| 34 | +frame=tb, % Any extra options here |
| 35 | +showstringspaces=false % |
| 36 | +}} |
| 37 | + |
| 38 | + |
| 39 | +% Python environment |
| 40 | +\lstnewenvironment{python}[1][] |
| 41 | +{ |
| 42 | +\pythonstyle |
| 43 | +\lstset{#1} |
| 44 | +} |
| 45 | +{} |
| 46 | + |
| 47 | +% Python for external files |
| 48 | +\newcommand\pythonexternal[2][]{{ |
| 49 | +\pythonstyle |
| 50 | +\lstinputlisting[#1]{#2}}} |
| 51 | + |
| 52 | +% Python for inline |
| 53 | +\newcommand\pythoninline[1]{{\pythonstyle\lstinline!#1!}} |
| 54 | + |
| 55 | + |
| 56 | +\usepackage{collectbox} |
| 57 | + |
| 58 | +\newcommand{\mybox}[2]{$\quad$\fbox{ |
| 59 | +\begin{minipage}{#1cm} |
| 60 | +\hfill\vspace{#2cm} |
| 61 | +\end{minipage} |
| 62 | +}} |
| 63 | + |
| 64 | + |
| 65 | +\usepackage{fancyhdr} |
| 66 | +\pagestyle{fancy} |
| 67 | +\rhead{Programmazione 1 - Esercitazione 7} |
| 68 | + |
| 69 | +\include{book_header} |
| 70 | + |
| 71 | +\begin{document} |
| 72 | +\thispagestyle{empty} |
| 73 | +\hrule |
| 74 | +\begin{center} |
| 75 | + {\Large {\bf Programmazione 1 \hspace{3cm} $\quad \quad \quad$ Esercitazione 7}} |
| 76 | +\end{center} |
| 77 | +{\bf Cognome: }\hspace{2.5cm} {\bf Nome: } \hspace{2.5cm} {\bf Matricola: } \\\ |
| 78 | +\hrule |
| 79 | + |
| 80 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 81 | +\section*{} |
| 82 | +Questa è la prima di due esercitazioni che vi guideranno alla scrittura di un programma che possa fare delle semplici previsioni |
| 83 | +sui voti che un utente potrebbe dare a dei film che non ha ancora valutato. |
| 84 | + |
| 85 | +L'obiettivo didattico dell'esercitazione è di far pratica nello scrivere programmi per la lettura di file di testo, |
| 86 | +nella costruzione di liste di liste o tuple, e nell'uso di dizionari. Si consiglia pertanto di ripassare |
| 87 | +il contenuto del notebook Lab 10. |
| 88 | + |
| 89 | +Per questa esercitazione si devono usare i seguenti file di testo (i dati sono reali): |
| 90 | +\begin{enumerate} |
| 91 | +\item {\tt u.user}: contiene le informazioni sugli utenti. |
| 92 | +\item {\tt u.item}: contiene le informazioni sui film. |
| 93 | +\item {\tt u1.base}: contiene le valutazioni degli utenti ai film, su una scala da 1 a 5. |
| 94 | +\end{enumerate} |
| 95 | + |
| 96 | +L'esercitazione va svolta andando completare il codice per le funzioni contenute nel file {\tt Testing\_es\_7.py} disponibile sul sito. Gli esercizi da svolgere in ordine sono: |
| 97 | + |
| 98 | +\begin{enumerate} |
| 99 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 100 | +\item Scrivere una funzione {\tt ParseUsers(filename)} che legge il file di testo chiamato {\tt filename} |
| 101 | +e restituisce una lista di tuple, in cui ogni tupla contiene le informazioni di un utente. |
| 102 | +Il file di input contiene una riga per ogni utente con le informazioni seguenti: |
| 103 | +\begin{center} |
| 104 | +{\tt user id | age | gender | occupation | zip code} |
| 105 | +\end{center} |
| 106 | + |
| 107 | +\mybox{15}{2} |
| 108 | + |
| 109 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 110 | +\item Scrivere una funzione {\tt CountGender(Ls)} che prende in input la lista di tuple {\tt Ls} |
| 111 | +contenente le informazioni degli utenti e conta il numero di utenti per ogni {\it gender}. |
| 112 | + |
| 113 | +Il risultato dovrebbe essere 273 utenti di sesso femminile e 670 di sesso maschile. |
| 114 | + |
| 115 | +\mybox{15}{2} |
| 116 | + |
| 117 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 118 | +\item Scrivere una funzione {\tt CountOccupation(Ls)} che prende in input la lista di tuple {\tt Ls} |
| 119 | +contenente le informazioni degli utenti e conta il numero di utenti per ogni tipo di occupazione. |
| 120 | +Il conteggio viene memorizzato in un dizionario in cui la chiave è il tipo di occupazione, mentre il valore |
| 121 | +è il rispettivo numero di utenti. |
| 122 | + |
| 123 | +\mybox{15}{2.5} |
| 124 | + |
| 125 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 126 | +\item Scrivere una funzione {\tt CountAge(Ls)} che prende in input la lista di tuple {\tt Ls} |
| 127 | +contenente le informazioni degli utenti e conta il numero di utenti per le seguenti fasce di età: |
| 128 | +$(x<18, 18\leq x <25, 25 \leq x < 40, 40 \leq x < 65, x > 65)$. La funzione deve restituire una lista |
| 129 | +con i valori per le relative fasce di età. |
| 130 | + |
| 131 | +\mybox{15}{2.5} |
| 132 | + |
| 133 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 134 | +\item Scrivere una funzione {\tt ParseFilm(filename)} che legge il file {\tt filename} |
| 135 | +e restituisce un dizionario, in cui ogni chiave è l'id di un film e il rispettivo valore |
| 136 | +è lista con le informazioni sul film. |
| 137 | +Il file di input contiene una riga per ogni film, e ogni riga contiene in ordine le informazioni seguenti: |
| 138 | +\begin{center} |
| 139 | +{\tt movie id|movie title|release date|video release date|IMDb URL|unknown|Action| |
| 140 | +Adventure|Animation|Children's|Comedy|Crime|Documentary|Drama|Fantasy|Film-Noir| |
| 141 | +Horror|Musical|Mystery|Romance|Sci-Fi|Thriller|War|Western} |
| 142 | +\end{center} |
| 143 | + |
| 144 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 145 | +\item Scrivere una funzione {\tt CountItem(Fs, i):} che prende in input un dizionario {\tt Fs} come |
| 146 | +restituito dalla funzione precedente, e un indice {\tt i}>5, e conta il numero di film con il genere |
| 147 | +corrispondente all'$i$-esimo elemento della lista che descrive un film. Per esempio, |
| 148 | +il numero di film thriller è 251. |
| 149 | + |
| 150 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 151 | +\item Scrivere una funzione {\tt CountYears(Fs):} che prende in input un dizionario {\tt Fs} come |
| 152 | +restituito dalla funzione precedente, e conta il numero di film usciti in ogni anno. Per contare l'anno, |
| 153 | +si deve elaborare il campo {\tt release date} estraendone l'anno (si consiglia di usare la funzione {\tt split}). |
| 154 | +Per esempio, si dovrebbe ottenere che nel 1996 sono usciti 355 film. |
| 155 | + |
| 156 | +\mybox{15}{2} |
| 157 | + |
| 158 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 159 | +\item Scrivere una funzione {\tt ParseRating(filename)} che legge il file {\tt filename} |
| 160 | +e restituisce una lista di liste, una per ogni rating. |
| 161 | +Il file di input contiene le informazioni seguenti: |
| 162 | +\begin{center} |
| 163 | +{\tt user id | item id | rating | timestamp} |
| 164 | +\end{center} |
| 165 | + |
| 166 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 167 | +\item Scrivere una funzione {\tt CountFiled(Ls, i)} che prende in input una lista di rating |
| 168 | +e un indice i < 3, e per ogni elemento della lista conta il numero di occorrenze diverse. |
| 169 | +Questa funzione può essere usata per contare il numero di volte che ciascun voto è stato dato |
| 170 | +(usata con $i=2$), il numero di voti dati da ciascun utente ($i=0$), oppure il numero |
| 171 | +di voti ricevuti da ciascun film ($i=1$). |
| 172 | + |
| 173 | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| 174 | +\item Scrivere una funzione {\tt PrintTopFilm(Ds, top, Ts)} che prende in input un |
| 175 | +dizionario che ha una chiave per ogni film con il valore del numero di voti ricevuti, |
| 176 | +un numero intero {\tt top}, e il dizionario che mappa ogni id di un film nelle sua lista di informazioni, |
| 177 | +e stampi a video il titolo e il numero di valutazioni per i primi {\tt top} film più votati. |
| 178 | + |
| 179 | +\mybox{15}{2} |
| 180 | + |
| 181 | +\end{enumerate} |
| 182 | + |
| 183 | +\end{document} |
0 commit comments