forked from polito-info-2022/Esempi-esame
-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathastrologia.py
99 lines (70 loc) · 2.71 KB
/
astrologia.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# Soluzione esercizio "Zodiaco" - tema d'esame 25/06/2021
import operator
from pprint import pprint
FILE_ZODIACO = 'zodiaco.csv'
FILE_SPORTIVI = 'sportivi.csv'
def leggi_zodiaco(nome_file):
zodiaco = open(nome_file, 'r')
segni = []
for line in zodiaco:
campi = line.rstrip().split(',')
segni.append({'segno': campi[0], 'inizio': campi[1], 'fine': campi[2]})
zodiaco.close()
return segni
def leggi_sportivi(nome_file):
file_sport = open(nome_file, 'r', encoding='UTF-8')
sportivi = []
for line in file_sport:
campi = line.rstrip().split(',')
sportivi.append({'nome': campi[0], 'punti': int(campi[1]), 'nazione': campi[2], 'nato': campi[3]})
file_sport.close()
return sportivi
def trova_segno(nato, segni):
"""
Trova il segno zodiacale, a partire dalla data di nascita
:param nato: data di nascita, in formato 'gg/mm'
:param segni: elenco dei segni zodiacali
:return: il nome del segno zodiacale
"""
nascita = nato.split('/')[1] + nato.split('/')[0] # trasforma '15/03' in '0315'
for segno in segni:
# trasforma gg/mm/aaaa in mmgg (es: '25/05/1982' -> '0525')
gg_inizio = segno['inizio'].split('/')[1] + segno['inizio'].split('/')[0]
gg_fine = segno['fine'].split('/')[1] + segno['fine'].split('/')[0]
if (nascita >= gg_inizio) and (nascita <= gg_fine):
return segno['segno']
# altrimenti, se non lo trovo, sarà per forza Capricorno, perché è a cavallo dell'anno
return 'Capricorno'
def calcola_punti(sportivi, segni):
punti = {} # dizionario: segno -> punti, inizializzato a tutti 0
for segno in segni:
punti[segno['segno']] = 0
# considero ciascuno sportivo
for sportivo in sportivi:
nato = sportivo['nato']
segno = trova_segno(nato, segni)
punti[segno] = punti[segno] + sportivo['punti']
return punti
def calcola_classifica(punti):
classifica = []
for (segno, pt) in punti.items():
classifica.append({'segno': segno, 'punti': pt})
classifica.sort(key=operator.itemgetter('punti'), reverse=True)
return classifica
def stampa_istogramma(classifica):
top = classifica[0]['punti'] # il valore massimo è quello in testa alla classifica
for voce in classifica:
segno = voce['segno']
punti = voce['punti']
print(f'{segno:10s} ({punti:4d}) ', end='')
print('*' * int(50 * punti / top))
def main():
segni = leggi_zodiaco(FILE_ZODIACO)
# pprint(segni)
sportivi = leggi_sportivi(FILE_SPORTIVI)
# pprint(sportivi)
punti = calcola_punti(sportivi, segni)
classifica = calcola_classifica(punti)
stampa_istogramma(classifica)
# pprint(classifica)
main()