# -*- coding: utf-8 -*- u"""In questo script sono presenti delle strutture dati che descrivono l'esito delle votazioni per l'elezione del presidente degli Stati Uniti d'America. Vi chiederemo di implementare alcune funzioni per estrarre informazioni sulla votazione. I dati da elaborare sono contenuti nelle seguenti strutture dati - votiSeggi, contiene l'esito dello spoglio delle votazioni - candidati, ontiene l'elenco dei nomi dei candidati Maggiori informazioni sui contenuti delle variabili sono presenti nei commenti vicini alle stesse. Implementate le funzioni dichiarate subito dopo le variabili. Nei commenti vicini alle funzioni troverete maggiori indicazioni sul codice da implementare. con le specifiche descritte per ciascuna di esse. La struttura dati votiSeggi, contiene l'esito dello spoglio di tale votazione, ovvero i dati da elaborare. La lista candidati contiene l'elenco dei nomi dei candidati reali e per le schede bianche e nulle, che per semplicità sono da trattare come i candidati reali.""" ################################################## # Inizio descrizione strutture dati ################################################## u""" VotiSeggi è una lista di tuple. Ogni tupla contiene informazioni sui voti espressi in un seggio elettorale. Ogni tupla riporta le seguenti informazioni (l'ordine riportato qua sotto dall'alto verso il basso è lo stesso ordine utilizzato nella tupla da sinistra verso destra) - Nome del seggio - Tecnologia usata per il voto - Numero di schede bianche - Numero di schede nulle - Seguono poi la quantità voti raccolta da ogni candidato, secondo questo ordine: Bush, Gore, Browne, Nader, Harris, Hagelin, Buchanan, McReynolds, Phylips, Moorehead, Chote, McCharthy - Infine c'e' un valore numerico, che dovete ignorare """ # ****** attenzione, ci dovrebbero essere 14 numeri per tupla (12 candidati + bianche + nulle), invece sono 15 votiSeggi = [('Alachua', 'Optical', 1, 217, 105, 34124, 47365, 658, 3226, 6, 42, 263, 4, 20, 21, 0, 0), ('Baker', 'Optical', 1, 79, 46, 5610, 2392, 17, 53, 0, 3, 73, 0, 3, 3, 0, 0), ('Bay', 'Optical', 1, 541, 141, 38637, 18850, 171, 828, 5, 18, 248, 3, 18, 27, 0, 0), ('Bradford', 'Optical', 2, 41, 695, 5414, 3075, 28, 84, 0, 2, 65, 0, 2, 3, 0, 0), ('Brevard', 'Optical', 1, 277, 136, 115185, 97318, 643, 4470, 11, 39, 570, 11, 72, 76, 0, 0), ('Broward', 'Votomatic', 1, 4946, 7826, 177902, 387703, 1217, 7104, 54, 135, 795, 37, 74, 122, 0, 0), ('Calhoun', 'Optical', 1, 78, 0, 2873, 2155, 10, 39, 0, 1, 90, 1, 2, 3, 0, 0), ('Charlotte', 'Optical', 2, 170, 2985, 35426, 29645, 127, 1462, 6, 15, 182, 3, 18, 12, 0, 0), ('Citrus', 'Optical', 1, 154, 54, 29767, 25525, 194, 1379, 5, 16, 270, 0, 18, 28, 2, 0), ('Clay', 'Optical', 1, 223, 157, 41736, 14632, 204, 562, 1, 14, 186, 3, 6, 9, 0, 0), ('Collier', 'Votomatic', 1, 2070, 1134, 60450, 29921, 185, 1400, 7, 34, 122, 4, 10, 29, 0, 0), ('Columbia', 'Optical', 1, 76, 615, 10964, 7047, 127, 258, 1, 7, 89, 2, 8, 5, 0, 0), ('DeSoto', 'Datavote', 2, 66, 568, 4256, 3320, 23, 157, 0, 0, 36, 3, 8, 2, 3, 3), ('Dixie', 'Datavote', 1, 22, 306, 2697, 1826, 32, 75, 0, 2, 29, 0, 3, 2, 0, 0), ('Duval', 'Votomatic', 2, 5090, 21855, 152098, 107864, 952, 2757, 37, 162, 652, 15, 58, 41, 0, 0), ('Escambia', 'Optical', 1, 679, 3680, 73017, 40943, 296, 1727, 6, 24, 502, 3, 110, 20, 0, 0), ('Flagler', 'Optical', 1, 60, 7, 12613, 13897, 60, 435, 1, 4, 83, 3, 3, 12, 0, 0), ('Franklin', 'Optical', 2, 70, 350, 2454, 2046, 17, 85, 1, 3, 33, 0, 3, 2, 0, 0), ('Gadsden', 'Optical', 2, 121, 1946, 4767, 9735, 24, 139, 3, 4, 38, 4, 7, 6, 0, 0), ('Gilchrist', 'Datavote', 1, 47, 241, 3300, 1910, 52, 97, 0, 1, 29, 0, 2, 4, 0, 0), ('Glades', 'Datavote', 1, 68, 281, 1841, 1442, 12, 56, 0, 3, 9, 1, 0, 1, 0, 0), ('Gulf', 'Optical', 2, 47, 362, 3550, 2397, 21, 86, 2, 4, 71, 2, 2, 9, 0, 0), ('Hamilton', 'Optical', 2, 31, 373, 2146, 1722, 12, 37, 4, 1, 23, 8, 7, 4, 0, 0), ('Hardee', 'Datavote', 1, 84, 323, 3765, 2339, 17, 75, 0, 2, 30, 0, 2, 3, 0, 0), ('Hendry', 'Optical', 2, 39, 760, 4747, 3240, 11, 104, 3, 1, 22, 2, 7, 2, 0, 0), ('Hernando', 'Optical', 1, 83, 148, 30646, 32644, 116, 1501, 8, 26, 242, 4, 10, 22, 0, 0), ('Highlands', 'Votomatic', 1, 466, 520, 20206, 14167, 64, 545, 6, 16, 127, 3, 7, 8, 0, 0), ('Hillsborough', 'Votomatic', 1, 5431, 3640, 180760, 169557, 1138, 7490, 35, 217, 847, 29, 68, 154, 0, 0), ('Holmes', 'Optical', 1, 97, 40, 5011, 2177, 18, 94, 1, 7, 76, 3, 6, 2, 0, 0), ('IndianRiver', 'Votomatic', 1, 1044, 790, 28635, 19768, 122, 950, 4, 13, 105, 2, 13, 10, 0, 0), ('Jackson', 'Optical', 2, 94, 998, 9138, 6868, 40, 138, 0, 2, 102, 1, 4, 7, 0, 0), ('Jefferson', 'Datavote', 1, 30, 540, 2478, 3041, 14, 76, 2, 1, 29, 1, 0, 0, 0, 1), ('Lafayette', 'Optical', 2, 17, 160, 1670, 789, 6, 26, 2, 0, 10, 1, 1, 0, 0, 0), ('Lake', 'Optical', 1, 203, 3138, 50010, 36571, 204, 1460, 4, 36, 289, 1, 21, 15, 0, 0), ('Lee', 'Votomatic', 1, 1975, 2531, 106141, 73560, 538, 3587, 30, 81, 305, 5, 34, 96, 0, 0), ('Leon', 'Optical', 1, 176, 0, 39062, 61427, 330, 1932, 9, 28, 282, 7, 16, 31, 0, 0), ('Levy', 'Optical', 2, 51, 708, 6858, 5398, 92, 284, 1, 1, 67, 1, 10, 12, 0, 0), ('Liberty', 'Optical', 2, 21, 167, 1317, 1017, 12, 19, 0, 3, 39, 0, 1, 2, 0, 0), ('Madison', 'Datavote', 1, 31, 444, 3038, 3014, 18, 54, 0, 2, 29, 1, 1, 5, 0, 0), ('Manatee', 'Optical', 1, 109, 1264, 57952, 49177, 242, 2491, 5, 35, 271, 3, 19, 26, 0, 0), ('Marion', 'Votomatic', 1, 2410, 890, 55141, 44665, 662, 1809, 13, 26, 563, 6, 22, 49, 0, 0), ('Martin', 'Lever', 1, 177, 56, 33970, 26620, 109, 1118, 14, 29, 112, 7, 20, 14, 0, 0), ('MiamiDade', 'Votomatic', 1, 10570, 17833, 289533, 328808, 762, 5352, 87, 119, 560, 35, 69, 124, 0, 0), ('Monroe', 'Optical', 1, 83, 97, 16059, 16483, 162, 1090, 1, 26, 47, 0, 3, 7, 9, 0), ('Nassau', 'Datavote', 2, 197, 1295, 16404, 6952, 63, 253, 0, 8, 90, 4, 3, 3, 0, 0), ('Okaloosa', 'Optical', 1, 83, 679, 52093, 16948, 313, 985, 4, 15, 267, 2, 33, 20, 0, 0), ('Okeechobee', 'Optical', 2, 84, 774, 5057, 4588, 21, 131, 1, 4, 43, 1, 3, 4, 0, 0), ('Orange', 'Optical', 1, 640, 1197, 134517, 140220, 891, 3879, 13, 65, 446, 7, 41, 46, 0, 0), ('Osceola', 'Votomatic', 1, 634, 1039, 26212, 28181, 309, 732, 10, 20, 145, 5, 10, 33, 1, 0), ('PalmBeach', 'Votomatic', 2, 10134, 19218, 152951, 269732, 743, 5565, 45, 143, 3411, 302, 190, 104, 0, 0), ('Pasco', 'Votomatic', 1, 1763, 2124, 68582, 69564, 413, 3393, 19, 83, 570, 14, 16, 77, 0, 0), ('Pinellas', 'Votomatic', 1, 4240, 4258, 184825, 200630, 1230, 10022, 41, 442, 1013, 27, 72, 170, 0, 0), ('Polk', 'Optical', 1, 219, 668, 90295, 75200, 366, 2059, 8, 59, 533, 5, 46, 36, 0, 0), ('Putnam', 'Optical', 1, 82, 79, 13447, 12102, 114, 377, 2, 7, 148, 3, 10, 12, 0, 0), ('SantaRosa', 'Optical', 1, 163, 67, 36274, 12802, 131, 724, 1, 13, 311, 1, 43, 19, 0, 0), ('Sarasota', 'Votomatic', 1, 1846, 994, 83100, 72853, 431, 4069, 11, 94, 305, 5, 15, 59, 0, 0), ('Seminole', 'Optical', 1, 203, 48, 75677, 59174, 550, 1946, 6, 38, 194, 5, 18, 26, 0, 0), ('StJohns', 'Optical', 1, 426, 130, 39546, 19502, 210, 1217, 4, 11, 229, 2, 12, 13, 0, 0), ('StLucie', 'Optical', 1, 537, 82, 34705, 41559, 165, 1368, 4, 12, 124, 10, 13, 29, 0, 0), ('Sumter', 'Votomatic', 1, 596, 170, 12127, 9637, 53, 306, 2, 2, 114, 0, 3, 17, 0, 0), ('Suwannee', 'Optical', 2, 39, 686, 8006, 4075, 52, 180, 2, 4, 108, 0, 9, 5, 16, 0), ('Taylor', 'Optical', 2, 87, 517, 4056, 2649, 4, 59, 0, 3, 27, 1, 8, 1, 0, 0), ('Union', 'Hand', 2, 25, 233, 2332, 1407, 15, 33, 1, 0, 37, 0, 1, 0, 0, 0), ('Volusia', 'Optical', 1, 339, 171, 82357, 97304, 444, 2910, 8, 36, 498, 5, 20, 70, 0, 1), ('Wakulla', 'Datavote', 1, 49, 373, 4512, 3838, 30, 149, 2, 3, 46, 1, 0, 6, 0, 0), ('Walton', 'Optical', 1, 135, 72, 12182, 5642, 68, 265, 3, 11, 120, 2, 7, 18, 0, 0), ('Washington', 'Optical', 1, 305, 36, 4994, 2798, 32, 93, 0, 2, 88, 0, 9, 5, 3, 1)] u""" La variabile candidati riporta i nomi dei candidati e le etichette "Bianche" e "Nulle", secondo l'ordine con cui compaiono le corrispondenti informazioni nelle tuple della struttura dati qua sopra. """ candidati = ['Bianche', 'Nulle', 'Bush', 'Gore', 'Browne', 'Nader', 'Harris', 'Hagelin', 'Buchanan', 'McReynolds', 'Phylips', 'Moorehead', 'Chote', 'McCharthy'] ################################################## # Inizio descrizioni funzioni da implementare ################################################## # Le indicazioni sul lavoro da svolgere sono riportate nelle stringhe qua sotto def descrivi(lVoti, lCandidati): u"""Scrivere una funzione che calcoli per ogni candidato il numero minimo, il numero massimo, il totale e la media delle preferenze ottenute nei diversi seggis. Parametri in ingresso: lVoti - è la lista di tuple contenete l'esito dello scrutinio di ogni seggio. lVoti ha la stessa struttura di votiSeggi lCandidati - è la lista contenente i nomi dei candidati (incluse le schede Bianche e Nulle), ha una struttura della variabile candidati Return: la funzione deve restituire un dizionario di dizionari con la seguente struttura {nomeCandidato:{'seggioMax': nomeSeggio, 'maxVoti': valore, 'seggioMin': nomeSeggio, 'minVoti': valore, 'mediaVoti': valore, 'totVoti': valore}, nomeCandidato:{'seggioMax': nomeSeggio, 'maxVoti': valore, 'seggioMin': nomeSeggio, 'minVoti': valore, 'mediaVoti': valore, 'totVoti': valore}, ... } Dove nomeCandidato - è la stringa contenente il nome del candidato a cui si riferiscono i valori riassunti in ciascun dizionario "interno". seggioMax - è la stringa contenente il nome del seggio in cui il candidato ha ottenuto il massimo dei voti. maxVoti - è il valore massimo di voti ottenuti dal candidato in un singolo seggio seggioMin - è la stringa contenente il nomde del seggio in cui il candidato ha ottenuto il minimo dei voti. maxVoti - è il valore minimo di voti ottenuti dal candidato in un singolo seggio mediaVoti - è il valor medio di voti ottenuti dal candidato in tutti i seggi totVoti - è il valore del totale dei voti ottenuti dal candidato in tutti i seggi Vi ricordiamo che nel dizionario dovranno essere presenti anche le informazioni sulle schede bianche e nulle. Ognuna di queste ultime, dovrà essere trattata come se fosse un presidente. Per es., per le schede bianche dovrete calcolare maxVoti, seggioMax (rispettivamente il seggio in cui c'è stato il massimo delle schede bianche e il nome del seggio), seggioMin, ..., totVoti. In nomeCandidato usate il nome che appare nella variabile candidati ('Bianche' e 'Nulle'). """ pass # questa istruzione non fa niente, eliminatela pure. Scrivete il vostro codice qua sotto nCandidati = len(lCandidati) nSeggi = len(lVoti) dizDescrivi = {} contCandidato = 0 while contCandidato < nCandidati: dizCandidato = {'seggioMax': '', 'maxVoti': 0, 'seggioMin': '', 'minVoti': float('inf'), 'mediaVoti': 0.0, 'totVoti': 0} contSeggio = 0 while contSeggio < nSeggi: seggio = lVoti[contSeggio][0] preferenze = lVoti[contSeggio][contCandidato + 2] if preferenze >= dizCandidato['maxVoti']: dizCandidato['seggioMax'] = seggio dizCandidato['maxVoti'] = preferenze if preferenze <= dizCandidato['minVoti']: dizCandidato['seggioMin'] = seggio dizCandidato['minVoti'] = preferenze dizCandidato['totVoti'] += preferenze contSeggio += 1 dizCandidato['mediaVoti'] = dizCandidato['totVoti'] / float(nSeggi) dizDescrivi[lCandidati[contCandidato]] = dizCandidato contCandidato += 1 return dizDescrivi # Le indicazioni sul lavoro da svolgere sono riportate nelle stringhe qua sotto def stampaRiassunti(dizRiassunto): u"""Scrivete una funzione che stampi a video le informazioni contenute nel dizionario restituito dalla funzione precedente. Dovete visualizzare a video anche le informazioni sulle schede Bianche e Nulle. Parametri in ingresso: dizRiassunto - è il dizionario restituito dalla funzione descrivi() Le informazioni a video devono essere stampate come nell'esempio seguente: ---- RIASSUNTI ---- Chote totale 1803 media 26.9104477612 Union 0 # minimo dei voti conseguiti in un seggio e nome dei voti Pinellas 170 # max dei voti e seggio McCharthy totale 34 media 0.507462686567 Walton 0 Suwannee 16 """ pass # questa istruzione non fa niente, eliminatela pure. Scrivete il vostro codice qua sotto print('\n---- RIASSUNTI ----') for candidato in dizRiassunto.keys(): print('\n', candidato) dizAVideo = dizRiassunto[candidato] print('totale', dizAVideo['totVoti']) print('media', dizAVideo['mediaVoti']) print(dizAVideo['seggioMin'], dizAVideo['minVoti']) print(dizAVideo['seggioMax'], dizAVideo['maxVoti']) # Le indicazioni sul lavoro da svolgere sono riportate nelle stringhe qua sotto def graduatoria(dizRiassunto): u"""Scrivere una funzione che stampi a video la graduatoria dei candidati in base al totale delle preferenze ricevute da ciascun candidato. Parametri in ingresso: dizRiassunto - è il dizionario restituito dalla funzione descrivi() Le informazioni a video devono essere stampate come nell'esempio seguente: ---- GRADUATORIA ---- Browne 2911417 Gore 2911215 Bush 113820 Harris 97426 Nulle 61190 McReynolds 17479 Nader 16407 Buchanan 2280 Chote 1803 Moorehead 1370 Phylips 621 Hagelin 562 Bianche 86 McCharthy 34 """ pass # questa istruzione non fa niente, eliminatela pure. Scrivete il vostro codice qua sotto print('\n---- GRADUATORIA ----') lNomeCandidati = list(dizRiassunto.keys()) ordinato=False while ordinato==False: ordinato=True i=0 while i