Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.10 KB | None | 0 0
  1. '''
  2. Progettate una o piu' delle seguenti funzioni
  3. (all'inizio di ogni funzione viene specificato il numero di punti assegnato dal grader a quella funzione)
  4. Il punteggio complessivo dato dal grader e' il voto della prova di recupero.
  5. La somma dei punteggi ottenibili con gli esercizi e' maggiore di 30, chi supera il 30 otterra' il punteggio 32.
  6.  
  7. NOTA: il grader testa tutte le funzioni, quindi stampera' degli errori per le funzioni non implementate
  8. '''
  9.  
  10. from copy import deepcopy,copy
  11.  
  12. def es1(testo,k):
  13.     '''
  14.    1) 2 punti
  15.    la funzione es1(testo,k) che, presi in input:
  16.    - una stringa di testo contenente  unicamente spazi e parole con i 26 caratteri alfabetici  da 'a' a 'z'
  17.    - un intero  positivo k,
  18.    restituisce una versione crittografata della stringa di testo.
  19.    Nella stringa crittografata ciascun carattere diverso dallo spazio viene sostituito da un nuovo carattere.
  20.    Il nuovo carattere e' determinato dal valore di k e dalla posizione i che il carattere
  21.    originario occupa nell'ordinamento lessicografico dei 26 caratteri. Piu' precisamente
  22.    il nuovo carattere e' quello che occupa la posizione (i+k)%26 dell'ordinamento
  23.    lessicografico dei 26 caratteri.
  24.    Ad esempio per k=2  (ogni occorrenza di 'a' diviene 'c', ogni occorrenza di  'b' diviene 'd' ...
  25.    ogni occorrenza di 'z' diviene 'b'.
  26.    quindi per testo= 'lo zaino pesa' e k=2 viene restituita  la stringa  'nq bckpq rguc'
  27.    '''
  28.     # inserisci qui il tuo codice
  29.     newStr = []
  30.     lista_char = [chr(x) for x in range(97, ord('z')+1)]
  31.     print(len(lista_char))
  32.     for x in testo:
  33.         if x == ' ':
  34.             newStr+= ' '
  35.             continue
  36.         newStr+= lista_char[(ord(x)+k-97)%26]
  37.     return "".join(newStr)
  38.  
  39.  
  40.  
  41.  
  42. ###############################################################################################
  43.  
  44. def es2(dizionario):
  45.     '''
  46.    2) 2 punti
  47.    la funzione es2(dizionario) che, preso in input:
  48.    - un dizionario  avente per chiavi degli interi e per attributi liste di interi,
  49.    restituisce un nuovo dizionario.
  50.    Il nuovo dizionario ha per chiavi  gli interi presenti nelle liste-attributo del dizionario
  51.    di partenza  e per attributo chiavi  del dizionario  di partenza.
  52.    L'attributo  da associare alla chiave x nel nuovo dizionario viene determinato  in base
  53.    alla regola seguente: tra tutte le chiavi di dizionario che hanno x tra gli elementi della
  54.    loro lista attributo viene selezionata la chiave y  che ha il valore massimo e y
  55.    diviene l'attributo di x nel nuovo dizionario.
  56.    Ad esempio per dizionario={1:[1,2,3],2:[1,2,4]} la funzione restituisce il
  57.    nuovo dizionario {1: 2, 2: 2, 3: 1, 4: 2}
  58.    '''
  59.     # inserisci qui il tuo codice
  60.     newDict = dict()
  61.     setNum = set()
  62.     for x in dizionario:
  63.         for y in dizionario[x]:
  64.             if y in newDict:
  65.                 newDict[y] = max(newDict[y],x)
  66.             newDict[y] = x
  67.     return newDict
  68.  
  69. # es2({1:[1,2,3],2:[1,2,4]})
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81. ###############################################################################################
  82.  
  83. def es3(tabella):
  84.     '''
  85.    3) 4 punti
  86.    la funzione es3(tabella) che presa in input:
  87.    - una tabella  di interi (rappresentata tramite lista di liste in cui ciascuna lista e' una riga della tabella)
  88.    modifica distruttivamente la tabella e restituisce il numero totale di elementi che la tabella contiene.
  89.    Al termine della funzione, a seguito della modifica,  gli elementi nella tabella
  90.    debbono risultare ordinati in modo crescente per colonna.
  91.    Ad esempio per tabella=[[3,2,1,0],[2,1,3,5],[1,3,2,1]] la funzione restituisce 12 e
  92.    la tabella risulta modificata come segue: [[1, 1, 1, 0], [2, 2, 2, 1], [3, 3, 3, 5]]
  93.    '''
  94.     # inserisci qui il tuo codice
  95.     numCols = len(tabella[0])
  96.     numRows = len(tabella)
  97.     columns = [[] for x in range(numCols)]
  98.     # print(columns)
  99.     for x in range(len(tabella)):
  100.         for y in range(numCols):
  101.             columns[y].append(tabella[x][y])
  102.     for x in range(len(columns)):
  103.         columns[x].sort()
  104.     for x in range(len(columns)):
  105.         for y in range(len(columns[0])):
  106.             tabella[y][x] = columns[x][y]
  107.     return len(tabella)*len(tabella[0])
  108.  
  109. # es3([[3,2,1,0],[2,1,3,5],[1,3,2,1]])
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116. ###############################################################################################
  117.  
  118. def getcoord(tab,x):
  119.     a = []
  120.     for i in range(len(tab)):
  121.         for j in range(len(tab[0])):
  122.             if tab[i][j] == x:
  123.                 a = [i,j]
  124.     return a
  125. def getCols(tab,x):
  126.     a = []
  127.     a= getcoord(tab,x)
  128.     numcols = []
  129.     cols = len(tab)
  130.     for i in range(len(tab)):
  131.         numcols.append(tab[i][a[1]])
  132.     return numcols
  133. def getRows(tab,x):
  134.     numrows= []
  135.     b = []
  136.     b = getcoord(tab,x)
  137.     for i in range(len(tab)):
  138.         if i != b[0]: continue
  139.         for j in range(len(tab[0])):
  140.             if [i,j] == b: continue
  141.             numrows.append(tab[i][j])
  142.     return numrows
  143. def es4(matrice):
  144.     '''
  145.    4) 4 punti
  146.    la funzione es4(matrice) che, presa in input:
  147.    - una matrice quadrata di interi (rappresentata tramite lista di liste in cui ciascuna lista e' una riga della tabella)
  148.    modifica distruttivamente la matrice e restituisce la somma dei valori presenti nella matrice.
  149.    Al termine della funzione il valore matrice[i][j] per ogni riga i e colonna j della matrice
  150.    risulta sostituito con la somma dei valori presenti nela riga i e nella colonna j
  151.    della matrice originale.
  152.    Ad esempio  per  matrice=[[1,2,3],[4,5,6],[7,8,9]] la funzione  restituisce il valore 45 e
  153.    la matrice risulta modificata come segue: [[17, 19, 21], [23, 25, 27], [29, 31, 33]]
  154.    '''
  155.     # inserisci qui il tuo codice
  156.     newMatr = [[[] for _ in range(len(matrice[0]))] for x in range(len(matrice))]
  157.     summ = 0
  158.     for i in range(len(matrice)):
  159.         for j in range(len(matrice[0])):
  160.             summ+= matrice[i][j]
  161.     print(summ)
  162.     for i in range(len(matrice)):
  163.         for j in range(len(matrice[0])):
  164.             # print(getCols(matrice,matrice[i][j]),getRows(matrice,matrice[i][j]))
  165.             newMatr[i][j] = sum(getCols(matrice,matrice[i][j]))+sum(getRows(matrice,matrice[i][j]))
  166.     for i in range(len(matrice)):
  167.         for j in range(len(matrice[0])):
  168.             matrice[i][j] = newMatr[i][j]
  169.  
  170.     return summ
  171. # es4([[1,2,3],[4,5,6],[7,8,9]])
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181. ###############################################################################################
  182.  
  183. '''
  184. In tutti gli esercizi che seguono avremo a che fare con  dei files in formato json che
  185. contengono informazioni su una serie di film.
  186. Nel seguito indicheremo questo tipo di file come file di film.
  187. Il file di film e' un dizionario e le chiavi del dizionario sono stringhe.
  188. Ogni stringa contiene il titolo e l'anno di realizzazione di un film (le due informazioni
  189. sono separate dal carattere ;). attributo di ogni chiave e' un dizionario.
  190. Il dizionario contiene quattro chiavi: 'ATTORI', 'REGISTI', 'GENERI', 'PAESI'.
  191. A ciascuna di queste chiavi e' associata una lista.
  192. Ad 'ATTORI' e' associata la lista con i nomi degli attori che hanno partecipato al film.
  193. A 'REGISTI' e' associata la lista con i nomi dei registi del film.
  194. A 'GENERI' e' associata la lista coi generi cinematografici a cui il film e' riconducibile.
  195. A 'PAESI' e' associata la lista dei paesi in cui il film e' stato lavorato.
  196.  
  197. ecco di seguito un esempio di voce all'interno di un  file di film:
  198.  
  199. 'The Hill;1965': {'ATTORI': ['Sean Connery',
  200.                              'Harry Andrews',
  201.                              'Ian Bannen',
  202.                              'Alfred Lynch',
  203.                              'Ossie Davis',
  204.                              'Roy Kinnear',
  205.                              'Jack Watson',
  206.                              'Ian Hendry',
  207.                              'Michael Redgrave',
  208.                              'Norman Bird',
  209.                              'Neil McCarthy',
  210.                              'Howard Goorney',
  211.                              'Tony Caunter'],
  212.                   'GENERI': ['Drama', 'War'],
  213.                   'PAESI': ['UK'],
  214.                   'REGISTI': ['Sidney Lumet']}
  215.  
  216. '''
  217. import json
  218. import pprint
  219.  
  220. def getFilmsbyGenere(d, g):
  221.     l = []
  222.     for key in d:
  223.         for k in d[key]:
  224.             if k != 'GENERI': continue
  225.             if g in d[key][k]:
  226.                 s = key.find(';')
  227.                 l.append(key[:s])
  228.     l.sort()
  229.     return l
  230. def es5(fname,fname1):
  231.     '''
  232.    5) 6 punti
  233.    la funzione  es5(fname,fname1) che, preso in input l'indirizzo fname di un  file di film,
  234.    costruisce un dizionario che  registra poi  in formato json all'indirizzo fname1 e
  235.    restituisce  la lista (ordinata lessicograficamente) con tutti i generi cinematografici
  236.    presente nel file dei film.
  237.    Il dizionario  ha per chiavi  delle stringhe  e per attributi delle liste.
  238.    Le chiavi del dizionario sono i generi cinematografici dei film presenti nel file dei film.
  239.    Nelle liste attributo ci sono i nomi dei film che sono riconducibili a quel genere
  240.    cinematografico (ciascuna di queste liste deve risultare ordinata lessicograficamente).
  241.    '''
  242.     # inserisci qui il tuo codice
  243.     d = json.load(open(fname))
  244.     generi = []
  245.     newd = dict()
  246.     for key in d:
  247.         for k in d[key]:
  248.             if k != 'GENERI': continue
  249.             for x in d[key][k]:
  250.                 if x not in generi:
  251.                     generi.append(x)
  252.     for g in generi:
  253.         newd[g] = getFilmsbyGenere(d,g)
  254.     generi.sort()
  255.     with open(fname1,'w') as f:
  256.         json.dump(newd,f)
  257.     return generi
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270. ###############################################################################################
  271.  
  272. def es6(fname,fname1):
  273.     '''
  274.    6) 6 punti
  275.    la funzione es6(fname,fname1) che, preso in input l'indirizzo fname di un  file di film
  276.    costruisce un dizionario che  registra poi  in formato json all'indirizzo fname1.
  277.    Il dizionario  ha per chiavi  degli interi e per
  278.    attributi delle liste. Le chiavi del dizionario sono gli anni in cui sono stati realizzati
  279.    i film presenti nel file di film e l'attributo di un dato anno e' la lista dei film del file
  280.    girati in quell'anno ( ciascuna  lista deve essere ordinata lessicograficamente).
  281.    La funzione ritorna la coppia (tupla) con il primo e ultimo anno trovato.
  282.    '''
  283.     # inserisci qui il tuo codice
  284.     d = json.load(open(fname))
  285.     newd = dict()
  286.     for key in d:
  287.         if key[key.find(';')+1:] not in newd:
  288.             newd[key[key.find(';')+1:]] = []
  289.         newd[key[key.find(';')+1:]].append(key[:key.find(';')])
  290.     for key in newd:
  291.         newd[key].sort()
  292.     a = newd.keys()
  293.     with open(fname1,'w') as f:
  294.         json.dump(newd,f)
  295.     return (int(min(a)), int(max(a)))
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310. ###############################################################################################
  311.  
  312. def getAttori(d):
  313.     l = []
  314.     for key in d:
  315.         for k in d[key]:
  316.             if k != 'ATTORI': continue
  317.             for a in d[key][k]:
  318.                 if a not in l:
  319.                     l.append(a)
  320.     return l
  321.  
  322. def generiAttore(d,a):
  323.     g = []
  324.     for key in d:
  325.         if a in d[key]['ATTORI']:
  326.             for ge in d[key]['GENERI']:
  327.                 g.append(ge)
  328.     return g
  329.  
  330. def es7(fname,fname1):
  331.     '''
  332.    7) 6 punti
  333.    la funzione es7(fname,fname1) che, preso in input l'indirizzo fname di un
  334.    file di film, costruisce un dizionario che  registra poi  in formato json all'indirizzo fname1.
  335.    Il dizionario  ha per chiavi  e attributi delle stringhe.
  336.    Le chiavi del dizionario sono  nomi di attori che hanno recitato nei film presenti nel file di film.
  337.    Ad ogni attore viene associato il genere di film in cui l'attore e'
  338.    specializzato (vale a dire il genere che predomina tra i generi dei film in cui ha recitato).
  339.    Nel caso in cui per l'attore non ci sia un genere che predomina sugli altri, allora l'attore non
  340.    deve comparire nel dizionario.
  341.    La funzione torna la coppia (tupla) con il primo ed ultimo attore in ordine alfabetico.
  342.    '''
  343.     # inserisci qui il tuo codice
  344.     d = json.load(open(fname))
  345.     newd = dict()
  346.     la = getAttori(d)
  347.     finald = dict()
  348.     for a in la:
  349.         newd[a] = generiAttore(d,a)
  350.     for a in newd:
  351.         lgcount = {}
  352.         for el in newd[a]:
  353.             lgcount[el] = newd[a].count(el)
  354.         listVal = list(lgcount.values())
  355.         if listVal.count(max(listVal))>1:
  356.             continue
  357.         for el in lgcount:
  358.             if lgcount[el] == max(listVal):
  359.                 finald[a] = el
  360.  
  361.     listaA = list(finald.keys())
  362.     listaA.sort()
  363.  
  364.     with open(fname1,'w') as f:
  365.         json.dump(finald, f)
  366.     return (listaA[0],listaA[-1])
  367.  
  368.  
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376. ###############################################################################################
  377.  
  378. class Scheda_attore:
  379.     '''
  380.    8) 6 punti
  381.    l'esercizio richiede di implementare la classe Scheda_attore composta da un inizializzatore e due metodi
  382.    '''
  383.     def __init__(self, nome, films=set(), generi=set(), registi=set(), anni=set()):
  384.         '''Ciascun oggetto  della classe ha 4 attributi da specificare al momento
  385.        della creazione: nome, films, generi e registi.
  386.        Il primo attributo (nome) e' una stringa (il nome di un attore) gli altri tre sono insiemi.
  387.         - films e' l'insieme dei film in cui l'attore ha recitato.
  388.         - generi e' l'insieme dei generi dei film in cui l'attore ha recitato
  389.         - registi  e' l'insieme  dei registi che hanno diretto l'attore
  390.         - anni e' l'insieme degli anni in cui ha fatto film. '''
  391.         # inserisci qui il tuo codice
  392.         self.nome = nome
  393.         self.films = films
  394.         self.generi =generi
  395.         self.registi = registi
  396.         self.anni = anni
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.     def get_generi(self):
  404.        '''il metodo get_generi restituisce una lista contenente i generi della scheda in ordine lessicografico.'''
  405.        # inserisci qui il tuo codice
  406.        l= list(self.generi)
  407.        return l.sort()
  408.  
  409.  
  410.  
  411.  
  412.  
  413.     def aggiungi_film(self, film, titolo, anno):
  414.         '''il metodo aggiungi_film aggiunge i dati di un film alla scheda dell'attore, se ha fatto parte del film.
  415.            film:   dizionario con le informazioni del film
  416.            titolo: titolo del film
  417.            anno:   anno di produzione del film
  418.        '''
  419.         if self.nome in film['ATTORI'] :
  420.            self.films.add(titolo)
  421.            self.generi.update(film['GENERI'])
  422.            self.registi.update(film['REGISTI'])
  423.            self.anni.add(anno)
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.     def aggiorna_scheda(self, fname):
  432.         '''il metodo aggiorna_scheda , dato l'indirizzo di un file di film aggiorna gli attributi della scheda
  433.        tenendo conto degli eventuali film presenti nel file dei film in cui compare l'attore della scheda.
  434.        Per farlo usa il metodo aggiungi_film'''
  435.         # inserisci qui il tuo codice
  436.         d = json.load(open(fname))
  437.         for k in d:
  438.             titolo = k[k.find(';')+1:]
  439.             anno =  k[:k.find(';')]
  440.  
  441.             self.aggiungi_film( d[k], anno, titolo)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement