Sei sulla pagina 1di 77

Fondamenti di Informatica

Liste

Prof. E. Clementini
Tipi composti Si sono visti i tipi semplici come
int, float, str,..Queste hanno un
solo valore in cui la variabile può
avere un solo valore (scalare)
Tipi classici: Tipi Python: mentre i tipi composti sono
– Array – Stringhe quelle variabili a cui si associano
più valori. Una stringa è una
– Record – Liste collezione di caratteri per cui può
essere vista anche come tipo
– File – Tuple composto
– Insiemi
– Dizionari
– File
– Classi

15/10/2021 Fondamenti di Informatica - Prof. Clementini 2


Array
• collezioni di dati omogenei Un esempio può essere una collezione di numeri interi o numeri float, ovvero
dello stesso tipo.
• Esempio: successione di numeri:
– C={c0,c1,c2,…,cn-1}.

• Elementi della successione: Si può andare a ad assegnare tutta la collezione di tutti i


valori dello stesso tipo
– il nome C di tutta la collezione nel suo insieme;
– il tipo a cui appartengono i singoli valori (es. numeri interi);
– un indice numerico che va da 0 a n-1 che costituisce un ordinamento tra i valori
– la cardinalità della collezione data da n.

• N.B. Non confondere l’ordinamento per posizione da un ordinamento per valori crescenti o
decrescenti.

15/10/2021 Fondamenti di Informatica - Prof. Clementini 3


Liste nel linguaggio Python
• Gli array in Python sono realizzati con un tipo più generale: le liste
• il nome della variabile di tipo lista:
– Es: a=[2,4,7,1,5,3,1]
• il tipo dei valori componenti è detto tipo base
• l’indice della lista va sempre da 0 al numero di elementi meno 1
• Il numero totale di elementi (la cardinalità o dimensione della lista)
• Esempio di dichiarazione:
a=[2,4,7,1,5,3,1]
Il nome della lista è a
La sequenza è fatta di elementi omogenei di tipo int
L’indice va da 0 a 6
Il numero di elementi è 7

15/10/2021 Fondamenti di Informatica - Prof. Clementini 4


Esempi di dichiarazione
vocabolario=["amico","casa","telefono"]
numeri=[17,23]
listavuota=[]
Vocabolario è una lista di stringhe perchè ha le
parantesi quadre, la seconda è una lista di numeri interi,
mentre si ha a disposizione anche una lista senza
elementi.

15/10/2021 Fondamenti di Informatica - Prof. Clementini 5


Liste: accesso agli elementi
• l’operatore ‘parentesi quadre’
v=[2,5,7,3]
print (v[0]) → 2
print (v[2]) → 7
• con espressione intera nell’intervallo 0..D-1:
v[i]=5
v[i+1]=7
• se l’espressione tra parentesi è al di fuori dell’intervallo consentito,
si ha un messaggio di errore:
a=[1,2]
a[2] → IndexError: list index out of range

15/10/2021 Fondamenti di Informatica - Prof. Clementini 6


Dimensionamento delle liste
• In molti linguaggi precedenti gli array hanno una struttura
fissa, con un numero di elementi definiti una volta per tutte.
• In Python le liste sono mutevoli. Possiamo definire gli elementi
elencandoli come visto negli esempi di dichiarazione, oppure si
possono inserire elementi in progressione, oppure modificare a
piacimento gli elementi cancellandone o inserendone altri.
• Iniziamo col definire una lista con un numero fisso di elementi

15/10/2021 Fondamenti di Informatica - Prof. Clementini 7


range
• Un modo particolare per creare liste con numeri interi in
sequenza è la funzione range che abbiamo già usato nel
ciclo for
• range con un solo argomento crea una lista a partire da
zero
– range(5) → [0,1,2,3,4]
• range con due argomenti crea una lista a partire dal primo
argomento specificato:
– range(1,5) → [1,2,3,4]
• range con tre argomenti crea una lista nell’intervallo
specificato con uno ‘step’ dato dal terzo argomento
– range(2,11,2) → [2,4,6,8,10]
– range(8,0,-1) → [8,7,6,5,4,3,2,1]

15/10/2021 Fondamenti di Informatica - Prof. Clementini 8


Lista: lettura
Lettura componente per componente
Per effettuare la lettura ad esempio di 10 valori (in questo
caso dovrebbe essere i<10) si effettua un ciclo in cui se si
inserisce la variabile i, invece di perdere i valori si possono
conservarli e memorizzare i valori della sequenza in una
lista.
Per effettuare questo programma bisogna avere a
disposizione delle variabili, le quali vanno inizializzate. Quello
che bisogna fare è predisporre degli spazi, se ad esempio
bisogna leggere 10 elementi bisogna avere uno spazio di 10
elementi. Quindi bisogna predisporre una lista con tutti
elementi vuoti, se ad esempio si necessitano 10 spazi per la
lettura di 10 elementi si inizializza una lista con una vuota per
il numero di spazi che si occorre

15/10/2021 Fondamenti di Informatica - Prof. Clementini 9


Lista: lettura
• Iniziamo a predisporre una lista con il numero di elementi
necessari
• Possiamo allocare una lista con n elementi con valore 0 con
l’operatore di ripetizione:
lista=[0]*n Operatore di ripetizione già visto per le stringhe, si ripete per n volte la lista che
contiene uno 0. In questo modo si ha una lista contenente n 0.

• n=int(input("Inserire il numero di elementi"))


a=[0]*n
15/10/2021 Fondamenti di Informatica - Prof. Clementini 10
Lista: lettura
n=int(input("Inserire il numero di elementi"))
a=[0]*n

for i in range(n):
a[i]=int(input("Inserire il "+str(i+1)+" valore "))

15/10/2021 Fondamenti di Informatica - Prof. Clementini 11


Lista: stampa
for i in range(n):
print (a[i])

Per stampare la lista è possibile farlo con un altro ciclo for.

15/10/2021 Fondamenti di Informatica - Prof. Clementini 12


Programmi con liste
• Trovare il valore massimo di un vettore e la sua posizione

• Disegniamo il diagramma di flusso generalizzato:

Calcolo
Massimo

max,
posmax

15/10/2021 Fondamenti di Informatica - Prof. Clementini 13


Massimo di un vettore
• Disegniamo il diagramma esteso:

15/10/2021 Fondamenti di Informatica - Prof. Clementini 14


Massimo di un vettore
• Codifica:

n=int(input("Inserire il numero di elementi "))


a=[0]*n
for i in range(n):
a[i]=int(input("Inserire il valore in posizione "+str(i)+" "))
massimo=a[0]
posmax=0
for i in range(1,n):
if a[i]>massimo:
massimo=a[i]
posmax=i
print("massimo=",massimo)
print("in posizione",posmax)

15/10/2021 Fondamenti di Informatica - Prof. Clementini 15


Somma di due vettori
• diagramma di flusso • diagramma di flusso esteso

v1
La somma di due vettori si effettua componenti per componenti. Anche in
questo caso si ha il diagramma di flusso generalizzato. Nel diagramma di
v2 flusso esteso ci sono 4 cicli in sequenza

v3=v1+v2

v3

15/10/2021 Fondamenti di Informatica - Prof. Clementini 16


Somma di due vettori
print("Somma di due vettori")
n=int(input("Inserire la dimensione dei vettori "))
v1=[0]*n
v2=[0]*n
v3=[0]*n
print("Input primo vettore")
for i in range(n):
v1[i]=int(input("Inserire il valore in posizione
"+str(i)+" "))
print("Input secondo vettore")
for i in range(n):
v2[i]=int(input("Inserire il valore in posizione
"+str(i)+" "))

for i in range(n): #somma dei due vettori


v3[i]=v1[i]+v2[i]

print("Vettore risultato")
for i in range(n):
print (v3[i])
15/10/2021 Fondamenti di Informatica - Prof. Clementini 17
Array multidimensionali
0 1 2 3 4 5
• I più usati: array bidimensionali
0

• Occupazione memoria: numero righe 1


per numero colonne per occupazione
del tipo base 2

15/10/2021 Fondamenti di Informatica - Prof. Clementini 18


Array bidimensionali: dichiarazioni
• Le matrici si rappresentano con liste annidate

• Per esempio la matrice 1 2 3


4 5 6
7 8 9

• È dichiarata come segue:


A=[[1,2,3],[4,5,6],[7,8,9]]
• Per accedere a una riga:
– A[1] → [4,5,6]
• Per accedere a un elemento:
– A[1][2] →6

15/10/2021 Fondamenti di Informatica - Prof. Clementini 19


Matrici: Lettura
• Lettura di una matrice con r righe e c colonne
• Diagramma di flusso

15/10/2021 Fondamenti di Informatica - Prof. Clementini 20


Matrici: inizializzazione
• Per inizializzare una matrice di r righe e c colonne con tutti zeri
dobbiamo ripetere r volte l’allocazione di un vettore con c
elementi:
• Con l’operazione append:
a=[]
for i in range(r):
a.append([0]*c)

• Con la «list comprehension»:


a=[[0]*c for i in range(r)]

• oppure:
a=[[0 for j in range(c)] for i in range(r)]

15/10/2021 Fondamenti di Informatica - Prof. Clementini 21


Matrici: lettura
r=int(input("Inserire il numero di righe "))
c=int(input("Inserire il numero di colonne "))
a=[[0]*c for i in range(r)]

for i in range(r):
for j in range(c):
a[i][j]=int(input("a["+str(i)+"]["+str(j)+"]="))

15/10/2021 Fondamenti di Informatica - Prof. Clementini 22


Matrici: scrittura
1. Scrittura con print:
print(a)
si ottiene la lista di liste, es. [[1,2,3],[4,5,6],[7,8,9]]

2. Usiamo una formattazione:


for i in range(r):
for j in range(c):
print ('{:4d}'.format(a[i][j]),end=" ")
print()

Si lasciano 4 spazi ad ogni intero che va a stampare

15/10/2021 Fondamenti di Informatica - Prof. Clementini 23


Formattazione numeri in scrittura
• Modalità principali
– Stampa interi con un numero di posti fissato. Per una variabile intera a e 4 posti:
'{:4d}'.format(a)
– Stampa interi come sopra e inoltre riempiendo con zeri le cifre mancanti a
sinistra:
'{:04d}'.format(a)
– Stampa float con un numero di posti fissato e un numero di cifre dopo la virgola
fissato. Per una variabile float x, per 6 posti comprensivi di parte intera, parte
decimale e carattere punto, e per due cifre decimali:
'{:6.2f}'.format(x)
– Stampa float come sopra e inoltre riempiendo con zeri le cifre mancanti a
sinistra:
'{:06.2f}'.format(x)

15/10/2021 Fondamenti di Informatica - Prof. Clementini 24


Programmi con matrici
• Calcolo del massimo tra i valori di una matrice e della
sua posizione (riga e colonna)

Calcolo
Massimo

max,
rmax,cmax

15/10/2021 Fondamenti di Informatica - Prof. Clementini 25


Programmi con matrici
• Calcolo del massimo tra i valori di una matrice e della sua posizione (riga e
colonna)
• Codifica parziale:

massimo=a[0][0]
rmax=0
cmax=0
for i in range(r):
for j in range(c):
if a[i][j]>massimo:
massimo=a[i][j]
rmax=i
cmax=j
print("massimo=",massimo)
print("in posizione (",rmax,cmax,")")

15/10/2021 Fondamenti di Informatica - Prof. Clementini 26


Somma di matrici
• diagramma

c=a+b

15/10/2021 Fondamenti di Informatica - Prof. Clementini 27


Somma di matrici
• Codifica parziale:
for i in range(nr):
for j in range(nc):
c[i][j]=a[i][j]+b[i][j]

15/10/2021 Fondamenti di Informatica - Prof. Clementini 28


Matrici: calcolo del massimo per ogni riga

15/10/2021 Fondamenti di Informatica - Prof. Clementini 29


Matrici: calcolo del massimo per ogni riga

Fare codifica…

15/10/2021 Fondamenti di Informatica - Prof. Clementini 30


Matrici: calcolo del massimo per ogni colonna

15/10/2021 Fondamenti di Informatica - Prof. Clementini 31


Matrici: calcolo del massimo per ogni colonna

Fare codifica…

15/10/2021 Fondamenti di Informatica - Prof. Clementini 32


Verifica di una matrice diagonale
Quando si ha una verifica si ha una condizione vero o
falso, per parte triangolare superiore si hanno tutti 0 e
anche per triangolare inferiore con tutti 0

15/10/2021 Fondamenti di Informatica - Prof. Clementini 33


Verifica di una matrice diagonale
Prima versione:
Il ciclo for non mi diag=True si esaminano tutti gli elementi della matrice
consente di for i in range(r):
uscire dal ciclo for j in range(c):
rapidamente (in if (i!=j and a[i][j]!=0):
questo caso con diag=False
il secondo
elemento diverso
da 0 ad esempio if diag:
print ("La matrice inserita è diagonale")
else:
print ("La matrice inserita non è diagonale")

15/10/2021 Fondamenti di Informatica - Prof. Clementini 34


Verifica di una matrice diagonale
Seconda versione:

diag=True
i=0
while i<r and diag: Il ciclo while esterno cambia il numero di righe,
j=0
while j<c and diag:
if (i!=j and a[i][j]!=0):
diag=False
j=j+1
i=i+1

if diag:
print ("La matrice inserita è diagonale")
else:
print ("La matrice inserita non è diagonale")

15/10/2021 Fondamenti di Informatica - Prof. Clementini 35


Stringhe
nome="Mario"

nome=input("nome=")
print(nome)

lunghezza=len(nome)

if len(nome)==0: … #stringa vuota

l’operatore [] come per le liste:


ad esempio s1[0] restituisce il primo carattere della stringa s1

Le parti di una stringa tuttavia non sono modificabili, se data s1="Mario"


proviamo ad assegnare s1[0]='D' abbiamo un errore

Una porzione di stringa s1[n:m] estrare i caratteri dalla posizione n inclusa alla
posizione m esclusa

15/10/2021 Fondamenti di Informatica - Prof. Clementini 36


Stringhe
Possiamo scandire una stringa con un ciclo for:
for i in range(len(nome)):
print (nome[i])

Oppure:
for lettera in nome:
print (lettera)

15/10/2021 Fondamenti di Informatica - Prof. Clementini 37


Stringhe
concatenazione con l’operatore ‘+’:
s1="abc"
s2="def"
s3=s1+s2 #s3 contiene "abcdef"

Un carattere è una stringa di lunghezza 1


È indifferente identificare le stringhe costanti con il singolo apice o il doppio apice

l’operatore di uguaglianza tra stringhe:


if s1==s2: ……

operatori relazionali <, >, etc, dove per “minore” si intende “viene prima in ordine
alfabetico”:
if s1<s2: … #verifica se s1 viene prima di s2
#in ordine alfabetico

15/10/2021 Fondamenti di Informatica - Prof. Clementini 38


Altre operazioni su stringhe: split()
• La funzione split separa una stringa utilizzando il carattere specificato e restituisce una lista
di stringhe. Se il separatore è assente, la stringa è suddivisa in parole prendendo gli spazi
come separatore
– Es.
string="Ciao Mondo"
lista=string.split()
print(lista) #output: ['Ciao', 'Mondo']

string="a, b, c, d, e"
lista=string.split(',')
print(lista) #output: ['a', ' b', ' c', ' d', ' e']
In questo caso per separare i vari componenti di utilizza ','

15/10/2021 Fondamenti di Informatica - Prof. Clementini 39


Altre operazioni su stringhe: strip() e join()
• La funzione strip elimina spazi e fine linea a inizio e fine stringa
– Es.
lista_pulita=[]
for s in lista:
lista_pulita.append(s.strip())
print(lista_pulita)
#output: ['a', 'b', 'c', 'd', 'e']

• La funzione join è l'inverso della split: riunisce una lista di stringhe in un'unica stringa
connettendo le parti con un separatore
– Es.
stringa_riunita=','.join(lista_pulita)
print(stringa_riunita))
#output: a,b,c,d,e

15/10/2021 Fondamenti di Informatica - Prof. Clementini 40


Altre operazioni su stringhe: replace()
• La funzione 's.replace(s1,s2)' sostituisce, all'interno della
stringa s, la sottostringa s1 con la sottostringa s2. Esempio:
parola='babbo'
nuovaparola=parola.replace('b','s')
• Notare che 'replace' non sostituisce i valori direttamente nella
stringa iniziale, che rimane invariata, ma fornisce un risultato
che va assegnato a una nuova variabile

15/10/2021 Fondamenti di Informatica - Prof. Clementini 41


Proprietà di stringhe
• Verifica di una parola palindroma
– Es.: anilina, ereggere

Se il numero di parole è pari non


si ha una lettera centrale, mentre
se è dispari si ha un carattere
centrale indifferente

15/10/2021 Fondamenti di Informatica - Prof. Clementini 42


Parola palindroma
• Diagramma

15/10/2021 Fondamenti di Informatica - Prof. Clementini 43


Proprietà di stringhe: parola palindroma
s=input("parola=")
print(s)

i=0
j=len(s)-1
palin=True
while i<j and palin:
if s[i]!=s[j]:
palin=False
i=i+1
j=j-1

if palin:
print (s,"è una parola palindroma")
else:
print (s,"non è una parola palindroma")

15/10/2021 Fondamenti di Informatica - Prof. Clementini 44


Frase palindroma
• Estendere il problema al riconoscimento di una frase
palindroma:
– Utilizzare le funzioni split e join per separare le parole e
successivamente eliminare gli spazi

15/10/2021 Fondamenti di Informatica - Prof. Clementini 45


Sommario sulle liste
• Le liste hanno un ampio repertorio di funzioni che si possono
utilizzare.
• Nel seguito riassumiamo quelle principali

15/10/2021 Fondamenti di Informatica - Prof. Clementini 46


Concatenazione
• Concatenazione +
a=[1,2,3]
b=[4,5,6]
c=a+b
print(c) → [1,2,3,4,5,6]

15/10/2021 Fondamenti di Informatica - Prof. Clementini 47


Ripetizione
• Ripetizione *
[0]*4 → [0,0,0,0]
[1,2,3]*3 → [1,2,3,1,2,3,1,2,3] E' lo stesso fatto per inizializzare un array
a0

15/10/2021 Fondamenti di Informatica - Prof. Clementini 48


Porzioni di liste
>>> Lista = ['a', 'b', 'c', 'd', 'e', 'f']
>>> Lista[1:3]
['b', 'c'] Specifica un range di elementi
>>> Lista[:4] da estrarre, punto di inizio e
['a', 'b', 'c', 'd'] punto di fine-1, estrae una
>>> Lista[3:] sottolista con cui si estrae una
porzione. Se si omette il primo
['d', 'e', 'f']
indice si ha di default =0 come
>>> Lista[:] inizio. Stessa cosa per [3:
['a', 'b', 'c', 'd', 'e', 'f']

15/10/2021 Fondamenti di Informatica - Prof. Clementini 49


Valori di una lista
• I valori di una lista possono essere eterogenei
• Le liste possono essere annidate
• Esempio:
["ciao", 2.0, 5, [10, 20]]

15/10/2021 Fondamenti di Informatica - Prof. Clementini 50


range
• Liste che contengono numeri interi consecutivi possono essere
create con la funzione range
• Esempi:
>>> range(1,5)
[1, 2, 3, 4]
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 10, 2)
[1, 3, 5, 7, 9]

15/10/2021 Fondamenti di Informatica - Prof. Clementini 51


Accesso agli elementi
• L’indice va da 0 alla lunghezza meno 1
• Inoltre possono essere usati indici negativi che partono
dall’ultimo elemento. Per esempio:
a=[1,2,3]
print(a[-1]) → 3

15/10/2021 Fondamenti di Informatica - Prof. Clementini 52


Lunghezza di una lista
• Funzione len calcola dinamicamente la lunghezza di una
lista

Squadre = ["Juventus", "Inter", "Milan", "Roma"]


i = 0
while i < len(Squadre):
Finchè i < della lunghezza della lista
print (Squadre[i])
i = i + 1

15/10/2021 Fondamenti di Informatica - Prof. Clementini 53


Appartenenza ad una lista
• Operatore in restituisce un valore booleano
• Abbiamo già utilizzato in nel ciclo for:
for i in range(n):
• esempio in generale:
Squadre = ['Juventus', 'Inter', 'Milan', 'Roma']

'Inter' in Squadre

15/10/2021 Fondamenti di Informatica - Prof. Clementini 54


Operazione 'append' per le liste
• La funzione 'append' corrisponde a una concatenazione di una
lista con un elemento posto in coda
• Esempio:
lista=[1,4,3]
lista1=lista+[5] #lista1 è uguale a [1,4,3,5]
È equivalente a:
lista=[1,4,3]
lista1=lista.append(5) #lista1 è uguale a [1,4,3,5]

15/10/2021 Fondamenti di Informatica - Prof. Clementini 55


Cancellazione di elementi
• «del» rimuove un elemento o una porzione di elementi da una
lista:
>>> a = ['uno', 'due', 'tre']
>>> del a[1]
>>> a
['uno', 'tre']

>>> Lista = ['a', 'b', 'c', 'd', 'e', 'f']


>>> del Lista[1:5]
>>> print (Lista)
['a', 'f']

15/10/2021 Fondamenti di Informatica - Prof. Clementini 56


Aggiungere più elementi alla fine di una lista
• Funzione extend(lista)

lista=[1,1,2]
lista.extend([2,3])
print(lista) → [1, 1, 2, 2, 3]

15/10/2021 Fondamenti di Informatica - Prof. Clementini 57


Inserire un elemento in una lista in una posizione
determinata
• Funzione insert (indice,elemento): inserisce l’elemento in
posizione «indice» spostando a destra tutti gli altri elementi
lista=[1,1,2]
lista.insert(0,2)
print(lista) → [2, 1, 1, 2]
lista.insert(2,4)
print(lista) → [2, 1, 4, 1, 2]

15/10/2021 Fondamenti di Informatica - Prof. Clementini 58


Cancellare e restituire l’elemento alla fine di una
lista
• Funzione pop()
lista=[1,1,2]
ultimo=lista.pop()
print(lista) → [1, 1]
print(ultimo) → 2

15/10/2021 Fondamenti di Informatica - Prof. Clementini 59


Cancellare e restituire l’elemento in una data
posizione
• Funzione pop(indice)
lista=[4,3,1]
elemento=lista.pop(1)
print(lista) → [4, 1]
print(elemento) → 3

15/10/2021 Fondamenti di Informatica - Prof. Clementini 60


Cancellare un elemento se esiste
• Funzione remove(elemento)
lista=[4,3,1]
lista.remove(3)
print(lista) → [4, 1]

15/10/2021 Fondamenti di Informatica - Prof. Clementini 61


Ricercare un elemento in una lista
• Funzione index(elemento) restituisce la posizione
dell’elemento cercato (la prima occorrenza) o un errore se
l’elemento non c’è
lista=[4,3,1,1]
print(lista.index(3)) → 1
print(lista.index(1)) → 2

15/10/2021 Fondamenti di Informatica - Prof. Clementini 62


Iterazione su liste
• Due modi:
– Con una variabile indice
– Con una variabile elemento della lista
Squadre = ["Juventus", "Inter", "Milan", "Roma"]

i = 0 for squadra in Squadre:


while i < len(Squadre): print (squadra)
print (Squadre[i])
i = i + 1

15/10/2021 Fondamenti di Informatica - Prof. Clementini 63


Ordinare gli elementi in una lista
• Funzione sort(elemento) ordina gli elementi di
una lista in ordine crescente secondo l’ordine
naturale
lista=[4,3,1,1]
lista.sort()
print(lista) → [1, 1, 3, 4]

lista=["kappa","beta","phi","alpha"]
lista.sort()
print(lista) → ['alpha', 'beta', 'kappa', 'phi']

15/10/2021 Fondamenti di Informatica - Prof. Clementini 64


Copiare una lista
• Per copiare una lista, non basta fare un'assegnazione!
• Esempio:
lista=[2,5,3]
lista2=lista
• Apparentemente lista2 è una copia di lista, ma se modifichiamo una di
esse:
>>> lista2.append(7)
>>> lista
[2, 5, 3, 7]
>>> lista2
[2, 5, 3, 7]
• Entrambe le liste risultano modificate! Quindi l'assegnazione fa sì che ci
siano due nomi di variabile per la stessa lista, ma non fa una copia della
lista. Ben diverso è il caso delle variabili di tipo semplice, dove
un'assegnazione fa realmente una copia
15/10/2021 Fondamenti di Informatica - Prof. Clementini 65
Copiare una lista
• Per copiare realmente una lista bisogna usare l'operatore
'copy':
>>> lista=[2,5,3]
>>> lista2=lista.copy()
>>> lista2.append(7)
>>> lista
[2, 5, 3]
>>> lista2
[2, 5, 3, 7]
>>>

15/10/2021 Fondamenti di Informatica - Prof. Clementini 66


List comprehension
• L’abbiamo usata per la definizione di una
matrice:
a=[[0]*c for i in range(r)]

• In generale, la list comprehension è un modo


offerto da Python per creare liste che
rispecchia espressioni insiemistiche (calcolo
dei predicati)
• Esempi: 𝑆 = {𝑥 2 |𝑥 ∈ 0. . 9 }
V = {1,2,4,8, … , 212 }
𝑀 = {𝑥|𝑥 ∈ 𝑆 ∧ 𝑥 𝑝𝑎𝑟𝑖}
15/10/2021 Fondamenti di Informatica - Prof. Clementini 67
List comprehension
• Traduzione in Python

𝑆 = {𝑥 2 |𝑥 ∈ 0. . 9 }
S=[x**2 for x in range(10)]

V = {1,2,4,8, … , 212 }
V=[2**i for i in range(13)]

𝑀 = {𝑥|𝑥 ∈ 𝑆 ∧ 𝑥 𝑝𝑎𝑟𝑖}
M=[x for x in S if x%2==0]

15/10/2021 Fondamenti di Informatica - Prof. Clementini 68


List comprehension
• Nella list comprehension si usa una variabile in una
espressione per la quale bisogna stabilire l’insieme in
cui varia (con la ‘for’) e eventualmente altre condizioni
che deve rispettare la variabile (con la ‘if’)

M=[x for x in S if x%2==0]

𝑀 = {𝑥|𝑥 ∈ 𝑆 ∧ 𝑥 𝑝𝑎𝑟𝑖}

15/10/2021 Fondamenti di Informatica - Prof. Clementini 69


List comprehension
• output
S=[x**2 for x in range(10)]
V=[2**i for i in range(13)]
M=[x for x in S if x%2==0]

>>> print (S); print (V); print (M)


[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096]
[0, 4, 16, 36, 64]

15/10/2021 Fondamenti di Informatica - Prof. Clementini 70


List comprehension
• Esempio più difficile. Troviamo i numeri primi fino a 50
• «For» può essere annidato per più variabili
• Prima troviamo i numeri non primi aggiungendo all’insieme
tutti i multipli dei numeri da 1 a 7
nonprimi=[j for i in range(2,8) for j in range(i*2,50,i)]

• Poi troviamo i numeri primi costruendo un insieme di


numeri tali che non appartengono all’insieme dei numeri
non primi
primi = [x for x in range(2, 50) if x not in nonprimi]

>>> print(primi)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

15/10/2021 Fondamenti di Informatica - Prof. Clementini 71


Esercizi
1. Sommare i numeri contenuti in un vettore.
2. Dato un numero espresso in una base qualsiasi (minore di 10), esegua la
conversione del numero in base 10, utilizzando la formula di Horner. Il
numero da convertire è contenuto in una stringa.
3. Dato un numero espresso in base 10, esegua la conversione del numero
in base qualsiasi. Il numero convertito è contenuto in una stringa.
4. Verificare se una data parola è un palindromo antipodo diretto, cioè una
parola con la proprietà che se si sposta la lettera iniziale in coda è poi
possibile, leggendo a ritroso, riottenere la stessa parola. Ad esempio, la
parola ‘banana’ è un palindromo antipodo diretto.
5. Data una sequenza di numeri interi contenuti in un vettore, verificare se
la sequenza soddisfa la seguente condizione: i numeri sono tutti a
distanza k, dove k è una costante nota. La sequenza può iniziare da un
valore qualsiasi. Ad esempio, se k vale 3, una sequenza valida in ingresso
può essere 2, 5, 8, 11, 14, 17, 20.

15/10/2021 Fondamenti di Informatica - Prof. Clementini 72


Esercizi
5. Verificare se una matrice quadrata di numeri è costituita da valori interi
consecutivi crescenti, come illustrato nel seguente esempio:
0 1 2 3 4
 
5 6 7 8 9
 10 11 12 13 14 
 
 15 16 17 18 19 
 
 20 21 22 23 24 
6. Verificare se una data stringa è costituita da lettere consecutive. Si
consideri l’alfabeto come circolare (‘A’ è consecutivo di ‘Z’). Ad esempio,
le stringhe ‘LMNO’ e ‘XYZAB’ soddisfano la proprietà.
7. Calcolare i valori del triangolo di Tartaglia con un numero di righe
qualsiasi:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
. . . . . . . . . . .
15/10/2021 Fondamenti di Informatica - Prof. Clementini 73
6. Calcolare i valori del triangolo di Tartaglia con un numero di
righe qualsiasi:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
. . . . . . . . . . .

15/10/2021 Fondamenti di Informatica - Prof. Clementini 74


Esercizi
8. Calcolare i primi n multipli di un numero k e memorizzarli in un
vettore.
9. Calcolare i numeri della serie di Fibonacci e memorizzarli in un
vettore:
 1, se n = 0 oppure n = 1
fib(n) = 
 fib(n − 1) + fib(n − 2), se n  2

10. Realizzare un algoritmo per la ricerca di un elemento in un vettore


di dimensione n. L’algoritmo deve leggere da tastiera la
dimensione n del vettore, caricare un array A, stamparlo a video e
infine dire se l’elemento è contenuto oppure no.
11. Realizzare un algoritmo che verifica se tutti gli elementi di un array
A di dimensione n sono contenuti in un array B di dimensione m.
L’algoritmo deve leggere da tastiera le dimensioni n ed m
rispettivamente degli array A e B, caricarli e stamparli a video.
Infine dire se tutti gli elementi di A sono contenuti in B oppure no.

15/10/2021 Fondamenti di Informatica - Prof. Clementini 75


Esercizi
12. Realizzare un algoritmo che verifica se un vettore di interi di dimensione
n contiene tutti valori distinti tra di loro. L’algoritmo deve leggere da
tastiera la dimensione n del vettore, definire un array A, caricarlo e
produrre a video il messaggio se sono o meno valori distinti.
13. Realizzare un algoritmo che, dato un vettore di numeri interi, verifichi se
esso contiene valori ripetuti. L’algoritmo deve leggere da tastiera la
dimensione n del vettore, definire un array A, caricarlo e produrre a
video la risposta.
14. Realizzare un algoritmo che, dato un vettore contenente valori interi
ordinati in senso crescente, inserisca un nuovo intero in posizione
ordinata. L’algoritmo deve leggere da tastiera la dimensione n del
vettore, definire un array A, caricare i primi n numeri, aggiungere il
nuovo intero, e produrre a video il vettore.
15. Realizzare un algoritmo che, dato un vettore di numeri interi
possibilmente ripetuti, costruisca un altro vettore senza valori ripetuti
(cioè tale vettore deve contenere nello stesso ordine tutti i valori
contenuti nel vettore dato senza che ci siano ripetizioni).

15/10/2021 Fondamenti di Informatica - Prof. Clementini 76


Esercizi
• Data una lista che contiene possibilmente elementi ripetuti,
costruire una nuova lista senza ripetizioni
• Date due liste, costruire una terza lista che rappresenta
l’intersezione delle due liste
• Date due liste, costruire una terza lista che rappresenta
l’unione insiemistica delle due liste
• Date due liste, verificare se una è sottolista dell’altra
• Date due liste, verificare se una è anagramma dell’altra
15/10/2021 Fondamenti di Informatica - Prof. Clementini 77

Potrebbero piacerti anche