Corso di Python #8 slicing list (liste p.2)

Ottava  parte del corso python




DATATYPES


Ecco i datatypes disponibili:
Numbers
Bool
List
Tuple
Strings
Set
Dictionary

LIST 

Usiamo sempre la variabile "lista1"  come lista 
>>> lista1 = [0,1,2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

Adesso vediamo come "fare a fette" (slice) la lista.  (pensate ad uan fetta di pizza)
Ad esempio, voglio estrarre dalla lista solamente i valori che vanno dal primo al terzo.

Sapendo che il primo valore ha indice 0, devo estrarre quindi i valori con indice: 0,1 e 2
Proviamo: 
>>> lista1 = [0,1,2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> print(lista1[0:2])
>>> [0,1]
Che però non è il risultato sperato!

Questo perchè in python c'è  un sistema esclusivo , ovvero il numero a destra è escluso dalla selezione. Per cui per prendere le prima 3 cifre va messo come secondo numero quello successivo, non compreso.
>>> lista1 = [0,1,2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> print(lista1[0:3])
>>> [0,1,2]
Ecco fatto.

Vediamo quindi che in pratica abbiamo due valori dentro la parentesi quadra [inizio:fine] (escluso)
Se il primo numero è compreso, ovvero l'indice zero, si può anche omettere
>>> lista1 = [0,1,2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> print(lista1[:3])
>>> [0,1,2]
Che è uguale all'esempio di prima.

Se invece proviamo a mettere solo il numero a sinistra (inizio) e omettere quello di fine (a destra) vediamo cosa succede:
>>> lista1 = [0,1,2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> print(lista1[3:])
>>> [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]la versione senza inizio e fine, solo con i due punti, cosa fa? Fa una copia. Vediamo un esempio:

lista1 = [0,1,2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
lista2 = lista1[:]


Adesso abbiamo copiato la lista. Se aggiungo un elemento alla lista2, finira in lista1 o in lista2? Vediamo. Aggiungiamo 13 alla lista 1 e 14 alla lista2, vediamo dove vanno.

lista1 = [0,1,2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
lista2 = lista1[:]
lista1.append(13)
lista2.append(14)
print("LISTA1:")
print(lista1)
print("LISTA2:")
print(lista2)
>>>
LISTA1:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
LISTA2:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14]




Quindi abbiamo visto come mettere [:] senza inizio e fine, copia la listta e ne crea una totalmente nuova, uguale ma non coincidente con quella di prima, è proprio un nuovo oggetto "lista".

Ovvero stampa a partire dall'elemento di indice 3 e va fino alla fine.


vediamo una carrellata di esempi con altre varianti:
>>> lista1 = [0,1,2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> print(lista1[3:-1])
>>> [3, 4, 5, 6, 7, 8, 9, 10, 11]
^ (Va dall'elemento di indice 3 al -1)
>>> lista1 = [0,1,2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> print(lista1[-3:-1])
>>> [10, 11] 
^ (Va dall'elemento di indice -3 al -1)
>>> lista1 = [0,1,2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> print(lista1[:-3])
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
^ (Va fino all'elemento di indice -3 )


E la versione senza inizio e fine, solo con i due punti, cosa fa? Fa una copia. Vediamo un esempio:
lista1 = [0,1,2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
lista2 = lista1[:]

Adesso abbiamo copiato la lista. Se aggiungo un elemento alla lista2, finira in lista1 o in lista2? Vediamo. Aggiungiamo 13 alla lista 1 e 14 alla lista2, vediamo dove vanno.
lista1 = [0,1,2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
lista2 = lista1[:]
lista1.append(13)
lista2.append(14)
print("LISTA1:")
print(lista1)
print("LISTA2:")
print(lista2)
>>>
LISTA1:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
LISTA2:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14]


Quindi abbiamo visto come mettere [:] senza inizio e fine, copia la listta e ne crea una totalmente nuova, uguale ma non coincidente con quella di prima, è proprio un nuovo oggetto "lista".