'''Scrivere una funzione mesi(lst) che, presa una lista lst, ritorna una lista di lunghezza uguale a quella di lst dove, per ogni i, se nella posizione i della lista lst vi e' una stringa che codifica una data, allora in quella posizione la nuova lista ha la stringa corrispondente al nome del mese indicato nella data, altrimenti ha il carattere '*'. Una stringa che codifica una data e' del tipo gg-mm-aaaa dove gg codifica il giorno, mm il mese e aaaa l'anno. Si puo' assumere che non sono presenti in lst date di anni bisestili. Ad esempio: >>> mesi([1,'10-10-2007', '2-3-1962','casa', '31-11-2007']) [ '*', 'ottobre', '*', '*', '*'] mesi(['for i=1 to 10', '02-01-1981', 3.14, '28-04-1913', [04-03-2017], '3.14',1-01-1920]) ['*','gennaio','*','aprile','*','*','*'] >>> mesi(['10-10-2007-1', '2--3-1962', '31-03-2007','05-030-2016','04-03-20170']) ['*','*','marzo','*','*'] ''' # Input: lista di elementi eterogenei # Output: lista della stessa lunghezza di stringhe '*' o 'nomemese' # scandire tutta la lista e per ogni elemento # riconoscerlo e trasformarlo nell'output giusto def mesi(lst): '''Implementare qui la funzione''' return [trasforma3(x) for x in lst] # Input: un elemento eterogeneo # Output: stringa '*' o 'nomemese' # per riconoscere e trasformare un elemento # controllare se non è una stringa # tornare '*' # altrimenti controllare se ha il formato giusto # lunghezza 10 # i primi 2 sono un numero # il 4 e 5 sono un numero # se ultimi 4 sono un numero # se 3° e 6° sono '-' # convertire i 3 campi in numeri # controllare se il gg è giusto per il mese # torno il nome del mese # altrimenti '*' def trasforma(el): durate = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] nomi = ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'] if type(el) != str: return '*' # el è una stringa if len(el) != 10: return '*' if el[2] != '-' or el[5] != '-': return '*' mm = el[3:5] if not mm.isdecimal(): return '*' mm = int(mm) if not (1 <= mm <= 12): return '*' gg = el[0:2] if not gg.isdecimal(): return '*' gg = int(gg) if not (1 <= gg <= durate[mm-1]): return '*' aa = el[6:] if not aa.isdecimal(): return '*' return nomi[mm-1] import re # usiamo una espressione regolare per controllare/estrarre i dati # dalla struttura della stringa def trasforma2(el): durate = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] nomi = ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'] if type(el) != str: return '*' match = re.match('([0-9][0-9])-([0-9][0-9])-([0-9][0-9][0-9][0-9])$', el) if match: gg = int(match.group(1)) mm = int(match.group(2)) aa = int(match.group(3)) if not (1 <= mm <= 12): return '*' elif not (1 <= gg <= durate[mm-1]): return '*' else: return nomi[mm-1] else: return '*' # usiamo un dizionario per le corrispondenze mese => durata e nome def trasforma3(el): durate_e_nomi = { '01': (31, 'gennaio'), '02': (28, 'febbraio'), '03': (31, 'marzo'), '04': (30, 'aprile'), '05': (31, 'maggio'), '06': (30, 'giugno'), '07': (31, 'luglio'), '08': (31, 'agosto'), '09': (30, 'settembre'), '10': (31, 'ottobre'), '11': (30, 'novembre'), '12': (31, 'dicembre'), } if type(el) != str: return '*' match = re.match('([0-9][0-9])-([0-9][0-9])-[0-9][0-9][0-9][0-9]$', el) if match: mm = match.group(2) if mm not in durate_e_nomi: return '*' gg = int(match.group(1)) if not (1 <= gg <= durate_e_nomi[mm][0]): return '*' else: return durate_e_nomi[mm][1] else: return '*' if __name__ == '__main__': esempio = [1,'10-10-2007', '30-02-1962','casa', '32-11-2007'] print(esempio) print(mesi(esempio)) esempio = ['10-10-2007-1', '2--3-1962', '31-03-2007','05-030-2016','04-03-20170'] print(esempio) print(mesi(esempio)) esempio = ['for i=1 to 10', '02-01-1981', 3.14, '28-04-1913', [4-3-2017], '3.14',1-1-1920] print(esempio) print(mesi(esempio))