Laboratorio di Python Matrici con Liste Lab09 5 Aprile 2017
Outline Correzione esercizi per oggi Matrici Teoria Esercizi Esercizi per casa
Esercizio 1 per casa Scrivere una funzione che verifica se una lista è ordinata in modo crescente ( ) (supponiamo che la lista contenga oggetti ordinabili)
Esercizio 1 per casa Scrivere una funzione che verifica se una lista è ordinata in modo crescente ( ) (supponiamo che la lista contenga oggetti ordinabili) 1 def o r d i n a t a C r e s c e n t e ( L ) : 2 i f len ( L )==0: 3 return True 4 f o r i i n range ( 1, len ( L ) ) : 5 i f L [ i ]<L [ i 1]: 6 return F a l s e 7 return True
Esercizio 2 per casa Scrivere una funzione che presi come parametri due liste ordinate in modo 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 a s o l 2 3 def u n i s c i O r d i n a t e ( L1, L2 ) : 4 i f ( not o l. o r d i n a t a C r e s c e n t e ( L1 ) ) or ( not o l. o r d i n a t a C r e s c e n t e ( L2 ) ) : 5 p r i n t ( Le l i s t e devono e s s e r e o r d i n a t e i n modo c r e s c e n t e ) 6 return None 7 LR = [ ] 8 i = 0 9 j = 0 10 while i <len ( L1 ) and j <len ( 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 <len ( L1 ) : 19 LR = LR + L1 [ i : ] 20 e l s e : 21 LR = LR + L2 [ j : ] 22 23 return LR
Esercizio 3 per casa Scrivere una funzione ripetis(s) che data una lista di numeri naturali s, restituisce una nuova lista in cui compaiono gli stessi elementi di s e nello stesso ordine, ma ciascun s[i] è ripetuto s[i] volte. (Esempio: da [3,0,2] si deve ottenere [3,3,3,2,2].)
Esercizio 3 per casa Scrivere una funzione ripetis(s) che data una lista di numeri naturali s, restituisce una nuova lista in cui compaiono gli stessi elementi di s e nello stesso ordine, ma ciascun s[i] è ripetuto s[i] volte. (Esempio: da [3,0,2] si deve ottenere [3,3,3,2,2].) 1 def r i p e t i s ( s ) : 2 r e s = [ ] 3 f o r e i n s : 4 r e s += [ e ] e 5 return r e s 1 #a l t e r n a t i v a 2 def r i p e t i s 2 ( s ) : 3 r e s = [ ] 4 f o r e i n s : 5 f o r i i n range ( e ) : 6 r e s. append ( e ) 7 return r e s
Esercizio 4 per casa Scrivere una funzione analoga analoga alla precedente, ma che modifica la lista s.
Esercizio 4 per casa Scrivere una funzione analoga analoga alla precedente, ma che modifica la lista s. 1 def r i p e t i s p o s t o ( s ) : 2 i = 0 3 while i <len ( s ) : 4 e = s [ i ] 5 del 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 a 7 i = i+e
Outline Correzione esercizi per oggi Matrici Teoria Esercizi Esercizi per casa
Matrici come liste di liste Come possiamo rappresentare un matrice A r c in Python? Per esempio, la matrice A 3 2 : 0 1 A = 3 2 5 6 può essere rappresentata come una lista di liste. A = [[0,1],[3,2],[5,6]] Notiamo che: la notazione è coerente: quanto vale A[1][1]? (Nb: ricordate, in Informatica si parte da 0...) len(a) = 3, len(a[0]) = 2 Semplificazione: I vettori (matrici unidimensionali) sono vettori riga e vengono rappresentati come una lista che ha come primo elemento una lista. Dunque: [1, 2, 3] è una lista di numeri, ma non una matrice (e dunque neanche un vettore riga) [[1, 2, 3]] è un vettore riga, cioè una matrice [[1], [2], [3]] è un vettore colonna, trasposto del precedente.
Outline Correzione esercizi per oggi Matrici Teoria Esercizi Esercizi per casa
Semplificazioni e suggerimenti In tutti gli esercizi seguenti - se non diversamente specificato - supporremo per brevità che l utente inserisca matrici e vettori ben formati (dunque con la sintassi espressa in precedenza, tutte le righe della stessa lunghezza, elementi tutti numerici...) Nel codice allegato alla lezione verranno fornite anche le funzioni necessarie a controllare che l input rappresenti matrici e vettori ben formati Gli esercizi seguenti sono tutte funzioni ausiliarie necessarie per calcolare il prodotto tra due matrici Consiglio: svolgere tutti gli esercizi nello stesso file chiamato matrici.py
Esercizio Scrivere una funzione che stampa una matrice presa come parametro Esempio se A = [[10000,12],[3,2],[5,6]] stampa esattamente: 10000 12 3 2 5 6 Suggerimento: usare print(e, end='\t')
Esercizio Scrivere una funzione che stampa una matrice presa come parametro Esempio se A = [[10000,12],[3,2],[5,6]] stampa esattamente: 10000 12 3 2 5 6 Suggerimento: usare print(e, end='\t') 1 def stampamatrice (M) : 2 f o r r i g a i n M: 3 f o r e i n r i g a : 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
Esercizio Scrivere una funzione che, presi come parametri due liste (non vettori riga) moltiplicabili (verificare che abbiano la stessa lunghezza), calcola e restituisce il prodotto scalare, oppure None.
Esercizio Scrivere una funzione che, presi come parametri due liste (non vettori riga) moltiplicabili (verificare che abbiano la stessa lunghezza), calcola e restituisce il prodotto scalare, oppure None. 1 def m o l t l i s t e (U, V) : 2 i f len (U)==len (V) : 3 p r s c = 0 4 f o r i i n range ( len (V) ) : 5 p r s c = p r s c + (U[ i ] V[ i ] ) 6 return p r s c 7 e l s e : 8 return None
Un altra possibile soluzione in stile Python 1 def m o l t l i s t e 2 (U, V) : 2 i f len (U)==len (V) : 3 p r s c = 0 4 f o r eu, ev i n z i p (U, V) : #l o posso f a r e p e r c h e ' hanno l a s t e s s a l e n 5 p r s c = p r s c + eu ev 6 return p r s c 7 e l s e : 8 return None
Esercizi da una riga Scrivere tre funzioni: Una funzione che prende come parametro una matrice e restituisce il numero delle sue righe Una funzione che prende come parametro una matrice e restituisce il numero delle sue colonne Una funzione che verifica se due matrici prese come parametri possono essere moltiplicate tra loro
Esercizi da una riga Scrivere tre funzioni: Una funzione che prende come parametro una matrice e restituisce il numero delle sue righe Una funzione che prende come parametro una matrice e restituisce il numero delle sue colonne Una funzione che verifica se due matrici prese come parametri possono essere moltiplicate tra loro 1 def r i g h e (M) : 2 return len (M) 3 4 def c o l o n n e (M) : 5 return len (M[ 0 ] ) 6 7 def s o n o m a t r m o l t (M,N) : 8 return c o l o n n e (M) == r i g h e (N)
Esercizio Scrivere una funzione che calcola e restituisce la trasposta di una matrice presa come parametro.
Esercizio Scrivere una funzione che calcola e restituisce la trasposta di una matrice presa come parametro. 1 def t r a s p o s t a (M) : 2 MT = [ ] 3 r = r i g h e (M) 4 i f r == 0 : #vuota 5 return MT 6 e l s e : 7 c = c o l o n n e (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 e 9 c o l = [ ] #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 e r i g h e 11 c o l. append (M[ j ] [ i ] ) 12 #ora i n c o l ho l a i ma colonna, che d i v e n t a l ' i ma r i g a 13 MT. append ( c o l ) 14 return MT
Esercizio Scrivere una funzione che restituisce la matrice prodotto tra due matrici prese come parametri (se non sono moltiplicabili, stampa un messaggio di errore e restituisce None). Suggerimento: usare la matrice trasposta per fare il prodotto scalare tra le righe di A e le righe della trasposta di B.
Soluzione 1 def molt mat (A,B) : 2 i f s o n o m a t r m o l t (A, B) : # se sono molt. 3 AB = [ ] #p r o d o t t o 4 BT = t r a s p o s t a (B) #t r a s p o s t a d i B 5 f o r i i n range ( r i g h e (A) ) : #r i g. d i A ( e AB) 6 r i g a = [ ] #i ma r i g a d i AB 7 #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 ( r i g h e (BT) ) : 9 i j = m o l t l i s t e (A[ i ],BT[ j ] ) 10 r i g a. append ( i j ) #elemento i n r i g a 11 AB. append ( r i g a ) #r i g a i n r i s u l t a t o 12 return AB 13 e l s e : 14 p r i n t ( M a t r i c i non m o l t i p l i c a b i l i ) 15 return None
Esercizi per casa (per il 10/04/2017 ore 13:59) (Mail: Lab09-...) Anche usando le funzioni viste a lezione: 1. Scrivere una funzione che determina se il suo parametro è una matrice quadrata 2. Scrivere una funzione che prende come parametri una matrice e un numero (verificare che lo sia) e restituisce il prodotto della matrice per quel numero. 3. Scrivere una funzione ricorsiva per calcolare il determinante di una matrice quadrata di ordine qualsiasi, con lo sviluppo di Laplace. Può essere utile una funzione ausiliaria per calcolare le sottomatrici per i minori. In particolare, fare attenzione a non modificare la matrice ma a creare una nuova matrice (dunque una deep copy - dettagli qui - per andare in profondità nelle righe). Hint: usare ad esempio copy.deepcopy oppure costruire a mano la sottomatrice con due cicli annidati.