# -*- 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
    


# 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




# 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


##################################################
# esempio di invocazione delle funzioni
##################################################

dizDescrizioni = descrivi(votiSeggi, candidati)
stampaRiassunti(dizDescrizioni)
graduatoria(dizDescrizioni)
