Esame Lun 31, Mag 2021 - A e B

Seminari Python @Sociologia, Università di Trento

Scarica esercizi e soluzioni

Modulo A

A1 babbà

✪✪ Scrivi del codice che data una lettera cerca da trovare e una frase, produce una lista con tutte le parole contenti quella lettera

  • USA una list comprehension

Mostra soluzione
[1]:

cerca = 'à'  # ['città', 'babbà']
#cerca = 'è'  # ['è', 'bignè', 'caffè']

frase = "Questa città è piena di babbà , bignè e caffè"

# scrivi qui


A2 selnum

✪✪ Date una lista la di numeri e una lb di booleani, scrivi del codice che MODIFICA la lista lc mettendoci dentro solo i numeri di la per cui c’è un True alla corrispondente posizione di lb

  • assumi che entrambe le liste abbiano esattamente le stesse dimensioni

Esempio - dati:

[2]:
la = [9,    7,     6,    8,    7]
lb = [True, False, True, True, False]

Dopo il tuo codice deve risultare

>>> print(lc)
[9, 6, 8]
Mostra soluzione
[3]:

la, lb = [9,7,6,8,7], [True, False, True, True, False]   # [9, 6, 8]
#la, lb = [3,5,2,3,4,2,4], [True, True, False, True, False, True, False]  # [3,5,3,2]
lc = []

# scrivi qui


A3 rospo

✪✪ Dato una stringa parola e una stringa ripetizioni contenente solo cifre, metti nella variabile risultato una stringa contenente tutte le lettere di parola ripetute per il numero di volte indicato alla posizione corrispondente in ripetizioni

Mostra soluzione
[4]:

parola, ripetizioni = "rospo", "14323"      # 'roooosssppooo'
#parola, ripetizioni = "artificio", "144232312"  # 'arrrrttttiifffiicccioo'

# scrivi qui


A4 miniera

✪✪ Dato un dizionario miniera che associa chiavi a numeri, MODIFICA il dizionario estratto associando le stesse chiavi di miniera a liste con le chiavi ripetute il numero di volte indicato.

Esempio - dato

miniera = {'ottone': 5,
           'rame'  : 8,
           'ferro' : 1}
estratto = {}

dopo il tuo codice deve risultare

>>> print(estratto)
{'ottone': ['ottone', 'ottone', 'ottone', 'ottone', 'ottone'],
 'rame'  : ['rame', 'rame', 'rame', 'rame', 'rame', 'rame', 'rame', 'rame'],
 'ferro' : ['ferro']}
Mostra soluzione
[5]:

miniera = {'ottone' : 5,
           'rame' : 8,
           'ferro' : 1}

estratto = {}

# scrivi qui


Modulo B

B1 Strutture sanitarie

✪✪ Scrivere una funzione che apre il dataset SANSTRU001.CSV con pandas (encoding UTF-8) e prende in input un codice comune e una stringa di testo, e RITORNA un dataframe con selezionate solo le righe aventi quel codice comune e che contengono la stringa nella colonna ASSISTENZA. Il dataset ritornato deve avere solo le colonne STRUTTURA, ASSISTENZA, COD_COMUNE, COMUNE. La funzione STAMPA anche il numero di righe trovate.

Fonte dati: dati.trentino.it

Mostra soluzione
[6]:
import pandas as pd   # importiamo pandas e per comodità lo rinominiamo in  'pd'
import numpy as np    # importiamo numpy e per comodità lo rinominiamo in 'np'


def strutsan(cod_comune, assistenza):
    raise Exception('TODO IMPLEMENT ME !')
[7]:
strutsan(22050, '')  # nessun filtro assistenza
***** SOLUZIONE
Trovate 6 strutture
[7]:
STRUTTURA ASSISTENZA COD_COMUNE COMUNE
0 PRESIDIO OSPEDALIERO DI CAVALESE ATTIVITA` CLINICA 22050 CAVALESE
1 PRESIDIO OSPEDALIERO DI CAVALESE DIAGNOSTICA STRUMENTALE E PER IMMAGINI 22050 CAVALESE
2 PRESIDIO OSPEDALIERO DI CAVALESE ATTIVITA` DI LABORATORIO 22050 CAVALESE
3 CENTRO SALUTE MENTALE CAVALESE ASSISTENZA PSICHIATRICA 22050 CAVALESE
4 CENTRO DIALISI CAVALESE ATTIVITA` CLINICA 22050 CAVALESE
5 CONSULTORIO CAVALESE ATTIVITA` DI CONSULTORIO MATERNO-INFANTILE 22050 CAVALESE
[8]:
strutsan(22205, 'CLINICA')
***** SOLUZIONE
Trovate 16 strutture
[8]:
STRUTTURA ASSISTENZA COD_COMUNE COMUNE
59 PRESIDIO OSPEDALIERO S.CHIARA ATTIVITA` CLINICA 22205 TRENTO
62 CENTRO DIALISI TRENTO ATTIVITA` CLINICA 22205 TRENTO
63 POLIAMBULATORI S.CHIARA ATTIVITA` CLINICA 22205 TRENTO
64 PRESIDIO OSPEDALIERO VILLA IGEA ATTIVITA` CLINICA 22205 TRENTO
73 OSPEDALE CLASSIFICATO S.CAMILLO ATTIVITA` CLINICA 22205 TRENTO
84 NEUROPSICHIATRIA INFANTILE - UONPI 1 ATTIVITA` CLINICA 22205 TRENTO
87 CASA DI CURA VILLA BIANCA SPA ATTIVITA` CLINICA 22205 TRENTO
90 CENTRO SERVIZI SANITARI ATTIVITA` CLINICA 22205 TRENTO
93 PSICOLOGIA CLINICA ATTIVITA` CLINICA 22205 TRENTO
122 ASSOCIAZIONE TRENTINA SCLEROSI MULTIPLA, ONLUS ATTIVITA` CLINICA 22205 TRENTO
123 ANFFAS TRENTINO ONLUS ATTIVITA` CLINICA 22205 TRENTO
124 COOPERATIVA SOCIALE IRIFOR DEL TRENTINO ONLUS ATTIVITA` CLINICA 22205 TRENTO
126 AGSAT ASSOCIAZIONE GENITORI SOGGETTI AUTISTICI... ATTIVITA` CLINICA 22205 TRENTO
127 AZIENDA PUBBLICA SERVIZI ALLA PERSONA - RSA PO... ATTIVITA` CLINICA 22205 TRENTO
130 CST TRENTO ATTIVITA` CLINICA 22205 TRENTO
133 A.P.S.P. 'BEATO DE TSCHIDERER' - AMB. LOGO-AUD... ATTIVITA` CLINICA 22205 TRENTO
[9]:
strutsan(22205, 'LABORATORIO')
***** SOLUZIONE
Trovate 5 strutture
[9]:
STRUTTURA ASSISTENZA COD_COMUNE COMUNE
61 PRESIDIO OSPEDALIERO S.CHIARA ATTIVITA` DI LABORATORIO 22205 TRENTO
85 LABORATORI ADIGE SRL ATTIVITA` DI LABORATORIO 22205 TRENTO
86 LABORATORIO DRUSO SRL ATTIVITA` DI LABORATORIO 22205 TRENTO
89 CASA DI CURA VILLA BIANCA SPA ATTIVITA` DI LABORATORIO 22205 TRENTO
92 CENTRO SERVIZI SANITARI ATTIVITA` DI LABORATORIO 22205 TRENTO

B2 Strutture Comune di Trento

✪✪ Scrivere una funzione selcir che apre il dataset 2019-02-17-strutture-comune-di-trento.csv con un reader csv (encoding utf-8) e data una lista filtro di parole, seleziona solo le righe che contengono alla colonna Circoscrizione almeno una delle parole indicate, STAMPA quanti risultati sono stati trovati e RITORNA una NUOVA lista di liste riportante le colonne Nome e Circoscrizione (senza header)

  • il filtro dovrebbe funzionare anche se nel testo ci sono parole con capitalizzazione diversa

  • ATTENZIONE 1: usare punto e virgola ; come delimiter nel csv reader

  • ATTENZIONE 2: se più parole del filtro vengono rilevate in una riga, dovresti includere la riga nell’output solo una volta!

Fonte dati: dati.trentino.it

Mostra soluzione
[10]:
import csv

def selcir(filtro):
    raise Exception('TODO IMPLEMENT ME !')


selcir(['argentario', 'gardolo'])
Trovati 16 risultati
[10]:
[['Argentario', 'Circoscrizione n. 06 - Argentario'],
 ['Martignano', 'Circoscrizione n. 06 - Argentario'],
 ['Montevaccino', 'Circoscrizione n. 06 - Argentario'],
 ['Gardolo', 'Circoscrizione n. 01 - Gardolo'],
 ['Roncafort (via Caproni)', 'Circoscrizione n. 01 - Gardolo'],
 ['Il Piccolo Girasole - Marnighe', 'Circoscrizione n. 06 - Argentario'],
 ['Gardolo', 'Circoscrizione n. 01 - Gardolo'],
 ['Aquilone - Gardolo', 'Circoscrizione n. 01 - Gardolo'],
 ['Roncafort (via Caneppele)', 'Circoscrizione n. 01 - Gardolo'],
 ['Arcobaleno - Martignano', 'Circoscrizione n. 06 - Argentario'],
 ['Margit Levinson - Roncafort', 'Circoscrizione n. 01 - Gardolo'],
 ['Biancaneve - Gardolo', 'Circoscrizione n. 01 - Gardolo'],
 ['Girasole - Melta', 'Circoscrizione n. 01 - Gardolo'],
 ['Gardolo - Meano', 'Circoscrizione n. 01 - Gardolo'],
 ['Argentario', 'Circoscrizione n. 06 - Argentario'],
 ['Gardolo', 'Circoscrizione n. 01 - Gardolo']]
[11]:
selcir(['argentario', 'Gardolo', 'RAVINA'])
Trovati 22 risultati
[11]:
[['Argentario', 'Circoscrizione n. 06 - Argentario'],
 ['Martignano', 'Circoscrizione n. 06 - Argentario'],
 ['Montevaccino', 'Circoscrizione n. 06 - Argentario'],
 ['Gardolo', 'Circoscrizione n. 01 - Gardolo'],
 ['Ravina', 'Circoscrizione n. 05 - Ravina - Romagnano'],
 ['Romagnano', 'Circoscrizione n. 05 - Ravina - Romagnano'],
 ['Roncafort (via Caproni)', 'Circoscrizione n. 01 - Gardolo'],
 ['Il Piccolo Girasole - Marnighe', 'Circoscrizione n. 06 - Argentario'],
 ['Gardolo', 'Circoscrizione n. 01 - Gardolo'],
 ['Aquilone - Gardolo', 'Circoscrizione n. 01 - Gardolo'],
 ['Ravina', 'Circoscrizione n. 05 - Ravina - Romagnano'],
 ['Roncafort (via Caneppele)', 'Circoscrizione n. 01 - Gardolo'],
 ['Arcobaleno - Martignano', 'Circoscrizione n. 06 - Argentario'],
 ['Girotondo - Ravina', 'Circoscrizione n. 05 - Ravina - Romagnano'],
 ['Margit Levinson - Roncafort', 'Circoscrizione n. 01 - Gardolo'],
 ['Biancaneve - Gardolo', 'Circoscrizione n. 01 - Gardolo'],
 ['Gli gnomi del bosco - Romagnano',
  'Circoscrizione n. 05 - Ravina - Romagnano'],
 ['Girasole - Melta', 'Circoscrizione n. 01 - Gardolo'],
 ['Gardolo - Meano', 'Circoscrizione n. 01 - Gardolo'],
 ['Argentario', 'Circoscrizione n. 06 - Argentario'],
 ['Ravina Romagnano', 'Circoscrizione n. 05 - Ravina - Romagnano'],
 ['Gardolo', 'Circoscrizione n. 01 - Gardolo']]

B3 gradini

✪✪✪ Data una matrice quadrata numpy mat di dimensione n, RITORNA un NUOVO array numpy contenente i valori recuperati dalla matrice nell’ordine seguente:

1,2,*,*,*
*,3,4,*,*
*,*,5,6,*
*,*,*,7,8
*,*,*,*,9
  • se la matrice non è quadrata, lancia ValueError

  • NON usare liste python!

  • SUGGERIMENTO: quanti elementi deve avere l’array da ritornare?

Esempio:

>>> gradini(np.array([ [6,3,5,2,5],
                       [3,4,2,3,4],
                       [6,5,4,5,1],
                       [4,3,2,3,9],
                       [2,5,1,6,7] ] ))
array([6., 3., 4., 2., 4., 5., 3., 9., 7.])
Mostra soluzione
[12]:
import numpy as np


def gradini(mat):
    raise Exception('TODO IMPLEMENT ME !')

m1 = np.array([ [7] ])
assert np.allclose(gradini(m1), np.array([7]))

m2 = np.array([ [6,8],
                [9,3]])
assert np.allclose(gradini(m2), np.array([6,8,3]))

m3 = np.array([ [6,3,5,2,5],
                [3,4,2,3,4],
                [6,5,4,5,1],
                [4,3,2,3,9],
                [2,5,1,6,7]])

assert np.allclose(gradini(m3), np.array([6,3,4,2,4,5,3,9,7]))
Mostra soluzione
[13]:
#SOLUZIONE 'PRO'

B4 muro

✪✪✪ Dato una lista ripe di ripetizioni e una matrice n x m mat come lista di liste, RITORNA una matrice completamente NUOVA prendendo le righe di mat e replicandole il numero di volte indicato nelle corrispondenti celle di ripe

  • NON devono risultare puntatori dalla matrice nuova a quella vecchia!

Esempio:

>>> muro([3,4,1,2], [['i','a','a'],
                     ['q','r','f'],
                     ['y','e','v'],
                     ['e','g','h']])
[['i', 'a', 'a'],
 ['i', 'a', 'a'],
 ['i', 'a', 'a'],
 ['q', 'r', 'f'],
 ['q', 'r', 'f'],
 ['q', 'r', 'f'],
 ['q', 'r', 'f'],
 ['y', 'e', 'v'],
 ['e', 'g', 'h'],
 ['e', 'g', 'h']]
Mostra soluzione
[14]:
def muro(ripe, mat):
    raise Exception('TODO IMPLEMENT ME !')

m1 = [['a']]
assert muro([2], m1) == [['a'],
                         ['a']]

m2 = [['a','b','c','d'],
      ['e','q','v','r']]
r2 = muro([3,2], m2)
assert r2 == [['a','b','c','d'],
              ['a','b','c','d'],
              ['a','b','c','d'],
              ['e','q','v','r'],
              ['e','q','v','r']]
r2[0][0] = 'z'
assert m2 == [['a','b','c','d'],  # vogliamo una NUOVA matrice
              ['e','q','v','r']]

m3 = [['i','a','a'],
      ['q','r','f'],
      ['y','e','v'],
      ['e','g','h']]
r3 = muro([3,4,1,2], m3)
assert r3 == [['i', 'a', 'a'],
              ['i', 'a', 'a'],
              ['i', 'a', 'a'],
              ['q', 'r', 'f'],
              ['q', 'r', 'f'],
              ['q', 'r', 'f'],
              ['q', 'r', 'f'],
              ['y', 'e', 'v'],
              ['e', 'g', 'h'],
              ['e', 'g', 'h']]
[ ]: