Liste

Le liste sono sequenze ordinate di oggetti enterogenei, accessibili tramite un indice numerico, che inizia da 0 , sono mutabili. Uno dei punti di forza del Python e' facilita' con cui si possono utilizzare le liste, e come si possono costruire strutture di dati complesse combinando liste e dizionari. Rispetto ai vettori, che troviamo in altri linguaggi, le liste hanno la caratteristica di contenere oggetti eterogenei, non tutti della stessa lunghezza; si possono fare anche liste di liste, o di dizionari o liste di funzioni. Le liste sono implementate internamente con referenze ad oggetti.

Una lista puo' crescere in modo dinamico, cioe' non si deve decidere all'inizio quanto sara' grande.

Operazioni sulle liste

Le liste, come sequenze, hanno tutte le caratteristiche e gran parte degli operatori che abbiamo gia' visto per le stringhe; agli elementi di una lista si accede con un indice intero, racchiuso fra parentesi quadre, e per gli indici e le slice (sezioni delle liste) vale quanto gia' visto per le stringhe. L'indice parte da zero.

Le liste si indicano con una serie di valori, separati da virgole e racchiusi fra parentesi quadre, ad esempio, per definire una lista A , composta dai numeri da 0 a 9:

A=[0,1,2,3,4,5,6,7,8,9]

Se abbiamo una lista i cui elementi sono liste, o comunque sequenze, si accede agli elementi "interni" con 2 indici, ognuno fra parentesi quadre, ad esempio se abbiamo una lista di liste:

A[[1,2,3],['a','b','c']],

ci si riferisce all'elemento 'c' con: A[1][2]. Il secondo indice e' relativo alla posizione dell'elemento della sequenze piu' "interna". A[2] e' tutta la sequenza: ['a','b','c'].

L'operatore '+' concatena 2 liste, l'operatore '*' ripete un certo numero di volte una lista, abbiamo gli operatori "in" e "not in" , che danno vero o falso a seconda che un oggetto faccia parte o no della lista. A differenza delle stringhe, le liste sono oggetti mutabili, quindi ci sono anche operatori e funzioni per modificare liste od elementi delle liste.

Per copiare una lista si deve usare una sintassi del tipo: B=A[:] , ovvero si devono copiare gli elementi; B=A non copia la lista, crea un nuovo riferimento B alla lista A. Se modifico A mi trovo le modifiche in B. Questo contrariamente a quello che succede con elementi non mutabili: Se abbiamo: "a=3 ; b=a ", l'istruzione: "a=4" crea un oggetto "4" ed un riferimento che punta a "4", l'oggetto "3" ed il suo riferimento "b" non sono alterati

Esempi:

A=[0,1,2,['a','b','c'],'fgk',3.4E10] : definizione lista complessa ove
                                       un elemento e' a sua volta una lista
A[3]==['a','b','c']
A[3][1]=='b'

A=[] : crea una lista vuota ed un riferimento 'A' alla lista.
A=['asdfg']  : lista di un solo elemento (una stringa)
               Qui A[0][0] e' il carattere 'a'

A=list((1,2,3)) : crea lista da una sequenza, qui la tupla: (1,2,3)

A[0]  : primo elemento

A[-1] : ultimo elemento (numeri negativi iniziano a contare dalla fine)

A[-2] : penultimo elemento

A[:] A[0:] :  tutta la lista

A[:0]   :     lista vuota

A[:3]   : elementi dal primo al terzo (quarto, con indice 3, escluso)

A[3:]   : elementi dal quarto in poi

A[1:5]    : dal secondo al quinto elemento

A[1:5:2] : dal secondo al quinto con passo 2

A[-1:-5:-2] : dall'ultimo al quint'ultimo, con passo 2

A[0]=1.3  :  sostituisce il primo elemento con un valore dato (qui 1.3)

A[0:3]='x' :sostituisce i primi 3 valori della lista con un unico elemento
           (qui x), la lista ora ha 2 elementi in meno.

del A[3:5]   :  elimina gli elementi dal 3 (compreso) al 5 (escluso)

del A[3:5:2] :  come sopra, ma con passo 2: uno si, uno no

A[0:3]=[]  : elimina i primi 3 elementi (da 0 a 2 )

del A[3]     : elimina l'elemento numero 3 (il quarto)

A[0:3]=['a','b','c'] : sostituisce i primi 3 elementi della lista
                       con elementi di una seconda lista

len(A) : lunghezza lista A

max(A), min(A) : massimo e minimo valore, se gli elementi non
                 sono confrontabili numericamente si ha un errore.

A.sort() : ordina gli elementi della lista

A.reverse() : mette gli elementi in ordine inverso

A.append('v') : aggiunge un elemento 'v' in fondo alla lista

A.extend([2,3,4]) : estende con altra sequenza, aggiungendola in fondo

A.count('v') : da il numero di volte che l'elemento 'v' e' nella lista

A.insert(3,'v') : inserisce l'elemento v nella posizione 3, gli altri
                  elementi vengono spostati.

A.index('v')    : restituisce l'indice del primo elementi 'v' che trova

A.pop() : restituisce l'ultimo elemento e lo elimina dalla lista.

A.pop(i) : restituisce l'elemento al posto i e lo elimina dalla lista.

B=[1,2,3]+[4,5,6]  : unione di liste: B==[1,2,3,4,5,6]

B=['ab']*3  : ripetizione di  liste: B=['ab','ab','ab',]

Gli elementi di una lista si possono assegnare a variabili, estraendo gli elementi, il numero di variabili deve essere eguale al numero di elementi della lista, in Python3 e' possibile non avere numero di variabili eguali agli elementi, ma assegnare parte degli elementi ad una nuova lista

a=[1,2,3,4,5]
g1,g2,g3,g4,g5=a

b,c,*d=a

      Qui: b==1 ; c==2 ; d==[3,4,5]

b,c,*d,e=a

       Qui: b==1 ; c==2 ; d==[3,4] ; e==5

Si possono unire a 2 a 2 gli elementi di una lista con la funzione zip:

a=[1,2,3]
b=['a','b','c']
c=zip(a,b)

In python 2 "c" contiene: [(1, 'a'), (2, 'b'), (3, 'c')]

In python 3 "c" e' uno zip object, con dentro la sequenza: (1, 'a') (2, 'b') (3, 'c') si deve fare: cc=list(c) per avere la lista

Si puo' applicare una funzione ad una lista con la funzione map:

c=map(abs,[-1,-2,-3])

In python2 map produce una lista.

In python3 un oggetto map da trasformare in una lista con la funzione "list". list(c) contiene: [1, 2, 3]

Nei loop sulle liste e' utile la funzione "range", ad esempio list(range(4)) restituisce una lista contenente [0, 1, 2, 3]. Per scorrere una lista senza sapere a priori quanto e' lunga possiamo usare:

for i in range(len(A)) :
   ....
   ....

List comprehensions

Sono cicli che assegnano una serie di valori ad una lista, sono posti fra parentesi quadre; opzionalmente i valori possono essere filtrati da una condizione "if"

[x for x in range(5) if x % 2 == 0]

produce una lista con i numeri pari fino a 5: [0, 2, 4]

Si possono avere cicli annidati:

[x + y for x in range(3) for y in [10, 20, 30]]

Qui x va da 0 a 3, e, per ogni x, y va da 10 a 30 ed abbiamo la lista;

[10, 20, 30, 11, 21, 31, 12, 22, 32]