Laboratorio di Python -...

31
Laboratorio di Python Matrici con Liste Lab09 10 Aprile 2018

Transcript of Laboratorio di Python -...

Laboratorio di PythonMatrici con Liste

Lab09

10 Aprile 2018

Outline

Correzione esercizi per oggi

MatriciTeoriaEsercizi

Esercizi per casa

Outline

Correzione esercizi per oggi

MatriciTeoriaEsercizi

Esercizi per casa

Esercizio 1 per casa

Scrivere una funzione che verifica se una lista e ordinata in modocrescente (≤) (supponiamo che la lista contenga oggetti ordinabili)

1 def ordinataCrescente(L):

2 i f l e n (L)==0:

3 r e t u r n True

4 f o r i i n range (1, l e n (L)):

5 i f L[i]<L[i-1]:

6 r e t u r n False

7 r e t u r n True

Esercizio 1 per casa

Scrivere una funzione che verifica se una lista e ordinata in modocrescente (≤) (supponiamo che la lista contenga oggetti ordinabili)

1 def ordinataCrescente(L):

2 i f l e n (L)==0:

3 r e t u r n True

4 f o r i i n range (1, l e n (L)):

5 i f L[i]<L[i-1]:

6 r e t u r n False

7 r e t u r n True

Esercizio 2 per casa

Scrivere una funzione che presi come parametri due liste ordinate inmodo crescente (verificarlo usando la funzione dell’esercizio precedente)ne crei una terza, anch’essa ordinata, dall’unione delle due.

Esercizio 2 per casa I

1 import Es1L08 as ol

2

3 def unisciOrdinate(L1, L2):

4 i f (not ol.ordinataCrescente(L1)) or (not ol

.ordinataCrescente(L2)):

5 p r i n t ("Le liste devono essere ordinate

in modo crescente")

6 r e t u r n None

7 LR = []

8 i = 0

9 j = 0

10 w h i l e i< l e n (L1) and j< l e n (L2):

11 i f L1[i]<=L2[j]:

12 LR.append(L1[i])

13 i+=1

14 e l s e :

15 LR.append(L2[j])

16 j+=1

Esercizio 2 per casa II

17

18 i f i< l e n (L1):

19 LR = LR + L1[i:]

20 e l s e :

21 LR = LR + L2[j:]

22

23 r e t u r n LR

Esercizio 3 per casa

Scrivere una funzione ripetis(s) che data una lista di numeri naturalis, restituisce una nuova lista in cui compaiono gli stessi elementi di s enello stesso ordine, ma ciascun s[i] e ripetuto s[i] volte. (Esempio: da[3,0,2] si deve ottenere [3,3,3,2,2].)

1 def ripetis(s):

2 res = []

3 f o r e i n s:

4 res += [e]*e

5 r e t u r n res

1 #a l t e r n a t i v a2 def ripetis2(s):

3 res = []

4 f o r e i n s:

5 f o r i i n range (e):6 res.append(e)

7 r e t u r n res

Esercizio 3 per casa

Scrivere una funzione ripetis(s) che data una lista di numeri naturalis, restituisce una nuova lista in cui compaiono gli stessi elementi di s enello stesso ordine, ma ciascun s[i] e ripetuto s[i] volte. (Esempio: da[3,0,2] si deve ottenere [3,3,3,2,2].)

1 def ripetis(s):

2 res = []

3 f o r e i n s:

4 res += [e]*e

5 r e t u r n res

1 #a l t e r n a t i v a2 def ripetis2(s):

3 res = []

4 f o r e i n s:

5 f o r i i n range (e):6 res.append(e)

7 r e t u r n res

Esercizio 4 per casa

Scrivere una funzione analoga analoga alla precedente, ma che modificala lista s.

1 def ripetisposto(s):

2 i = 0

3 w h i l e i< l e n (s):

4 e = s[i]

5 d e l s[i]

6 s[i:i] = [e]*e #i n s e r i m e n t o s o t t o l i s t a7 i = i+e

Esercizio 4 per casa

Scrivere una funzione analoga analoga alla precedente, ma che modificala lista s.

1 def ripetisposto(s):

2 i = 0

3 w h i l e i< l e n (s):

4 e = s[i]

5 d e l s[i]

6 s[i:i] = [e]*e #i n s e r i m e n t o s o t t o l i s t a7 i = i+e

Outline

Correzione esercizi per oggi

MatriciTeoriaEsercizi

Esercizi per casa

Outline

Correzione esercizi per oggi

MatriciTeoriaEsercizi

Esercizi per casa

Matrici come liste di listeCome possiamo rappresentare un matrice Ar×c in Python? Per esempio,la matrice A3×2:

A =

0 13 25 6

puo essere rappresentata come una lista di liste.A = [[0,1],[3,2],[5,6]]

Notiamo che:

I la notazione e coerente: quanto vale A[1][1]? (Nb: ricordate, inInformatica si parte da 0...)

I len(A) = 3, len(A[0]) = 2

Semplificazione: I vettori (matrici unidimensionali) sono vettori riga evengono rappresentati come una lista che ha come primo elemento unalista. Dunque:

I [1, 2, 3] e una lista di numeri, ma non una matrice (e dunqueneanche un vettore riga)

I [[1, 2, 3]] e un vettore riga, cioe una matrice

I [[1], [2], [3]] e un vettore colonna, trasposto del precedente.

Outline

Correzione esercizi per oggi

MatriciTeoriaEsercizi

Esercizi per casa

Semplificazioni e suggerimenti

I In tutti gli esercizi seguenti – se non diversamente specificato –supporremo per brevita che l’utente inserisca matrici e vettori ”benformati” (dunque con la sintassi espressa in precedenza, tutte lerighe della stessa lunghezza, elementi tutti numerici...)

I Nel codice allegato alla lezione verranno fornite anche le funzioninecessarie a controllare che l’input rappresenti matrici e vettori ”benformati”

I Gli esercizi seguenti sono tutte funzioni ausiliarie necessarie percalcolare il prodotto tra due matrici

I Consiglio: svolgere tutti gli esercizi nello stesso file chiamatomatrici.py

Esercizio

Scrivere una funzione che stampa una matrice presa come parametroEsempio se A = [[10000,12],[3,2],[5,6]] stampa esattamente:

10000 12

3 2

5 6

Suggerimento: usare print(e, end='\t')

Esercizio

1 def stampaMatrice(M):

2 f o r riga i n M:

3 f o r e i n riga:

4 p r i n t (e, end='\t')5 p r i n t () #a capo dopo o g n i r i g a

O con indici espliciti:

1 def stampaMatrice(M):

2 f o r i i n range ( l e n (M)):

3 f o r j i n range ( l e n (M[i]):

4 p r i n t (M[i][j], end='\t')5 p r i n t () #a capo dopo o g n i r i g a

Esercizio

Scrivere una funzione che, presi come parametri due liste (non vettoririga) moltiplicabili (verificare che abbiano la stessa lunghezza), calcola erestituisce il prodotto scalare, oppure None.

1 def molt_liste(U,V):

2 i f l e n (U)== l e n (V):

3 pr_sc = 0

4 f o r i i n range ( l e n (V)):

5 pr_sc = pr_sc + (U[i]*V[i])

6 r e t u r n pr_sc

7 e l s e :

8 r e t u r n None

Esercizio

Scrivere una funzione che, presi come parametri due liste (non vettoririga) moltiplicabili (verificare che abbiano la stessa lunghezza), calcola erestituisce il prodotto scalare, oppure None.

1 def molt_liste(U,V):

2 i f l e n (U)== l e n (V):

3 pr_sc = 0

4 f o r i i n range ( l e n (V)):

5 pr_sc = pr_sc + (U[i]*V[i])

6 r e t u r n pr_sc

7 e l s e :

8 r e t u r n None

Un’altra possibile soluzione in stile Python

1 def molt_liste_2(U,V):

2 i f l e n (U)== l e n (V):

3 pr_sc = 0

4 f o r eu , ev i n z i p (U, V): #l o p o s s o f a r ep e r c h e ' hanno l a s t e s s a l e n

5 pr_sc = pr_sc + eu*ev

6 r e t u r n pr_sc

7 e l s e :

8 r e t u r n None

Esercizi da una riga

Scrivere tre funzioni:

I Una funzione che prende come parametro una matrice e restituisce ilnumero delle sue righe

I Una funzione che prende come parametro una matrice e restituisce ilnumero delle sue colonne

I Una funzione che verifica se due matrici prese come parametripossono essere moltiplicate tra loro

1 def righe(M):

2 r e t u r n l e n (M)

3

4 def colonne(M):

5 r e t u r n l e n (M[0])

6

7 def sono_matr_molt(M,N):

8 r e t u r n colonne(M) == righe(N)

Esercizi da una riga

Scrivere tre funzioni:

I Una funzione che prende come parametro una matrice e restituisce ilnumero delle sue righe

I Una funzione che prende come parametro una matrice e restituisce ilnumero delle sue colonne

I Una funzione che verifica se due matrici prese come parametripossono essere moltiplicate tra loro

1 def righe(M):

2 r e t u r n l e n (M)

3

4 def colonne(M):

5 r e t u r n l e n (M[0])

6

7 def sono_matr_molt(M,N):

8 r e t u r n colonne(M) == righe(N)

Esercizio

Scrivere una funzione che calcola e restituisce la trasposta di una matricepresa come parametro.

Soluzione

1 def trasposta(M):

2 MT = []

3 r = righe(M)

4 i f r == 0: #v u o t a5 r e t u r n MT

6 e l s e :

7 c = colonne(M)

8 f o r i i n range (c): #c i c l o s u l l e c o l o n n e9 col = [] #i−ma c o l o n n a

10 f o r j i n range (r): #c i c l o s u l l er i g h e

11 col.append(M[j][i])

12 #o r a i n c o l ho l a i−ma c o l o n n a , c h ed i v e n t a l ' i−ma r i g a

13 MT.append(col)

14 r e t u r n MT

Esercizio

Scrivere una funzione che restituisce la matrice prodotto tra due matriciprese come parametri (se non sono moltiplicabili, stampa un messaggio dierrore e restituisce None).

Suggerimento: usare la matrice trasposta per fare il prodotto scalare trale righe di A e le righe della trasposta di B.

Soluzione

1 def molt_mat(A,B):

2 i f sono_matr_molt(A,B): # s e s o n o m o l t .3 AB = [] #p r o d o t t o4 BT = trasposta(B) #t r a s p o s t a d i B5 f o r i i n range (righe(A)): #r i g . d i A ( e

AB)6 riga = [] #i−ma r i g a d i AB7 #j s c o r r e r i g h e d i BT (= c o l d i B e AB

)8 f o r j i n range (righe(BT)):9 ij = molt_liste(A[i],BT[j])

10 riga.append(ij) #e l e m e n t o i nr i g a

11 AB.append(riga) #r i g a i n r i s u l t a t o12 r e t u r n AB

13 e l s e :

14 p r i n t ("Matrici non moltiplicabili")

15 r e t u r n None

Comunicazioni di servizio

Il prossimo laboratorio (Lab10 - Venerdı 13 aprile) avra come argomentola ricorsione.

Ripassare gli appunti presi e gli esercizi svolti a lezione e fare domande.

Outline

Correzione esercizi per oggi

MatriciTeoriaEsercizi

Esercizi per casa

Esercizi per casa (per il 13/04/2018 ore 8:59)(Mail: Lab09-..........)

Anche usando le funzioni viste a lezione:

1. Scrivere una funzione che determina se il suo parametro e unamatrice quadrata

2. Scrivere una funzione che prende come parametri una matrice e unnumero (verificare che lo sia) e restituisce una nuova matrice checostituisce il prodotto della matrice per quel numero. Non modificala matrice originale.

3. Scrivere una funzione che prende come parametri (tralasciare leverifiche)

I una matrice non vuota di interiI un intero n

e restituire la coppia (i,j) che identifica la posizione del primoelemento (leggendo la matrice per righe) che, sommato a tutti i suoiprecedenti, dia come risultato un valore > n.Se tale elemento non esiste, perche la somma di tutti gli elementi eminore di n, restituire la coppia (+∞,+∞)(Suggerimento: Usare float('inf') o math.inf)Non modificare la matrice ne usare altre liste. Usare il ciclo whilema non il ciclo for.