Slicing delle Liste in Python
Obiettivi della pillola
Alla fine di questa pillola saprai:
- usare gli indici positivi e negativi nelle liste;
- applicare lo slicing
lista[inizio:fine:passo]; - copiare e invertire una lista con lo slicing;
- modificare o cancellare più elementi tramite assegnazione di slice.
Cos’è lo slicing
Lo slicing permette di selezionare sotto-sequenze da una lista con la sintassi:
lista[inizio : fine : passo]
dove:
inizio= indice da cui partire (incluso, default 0);fine= indice dove fermarsi (escluso, defaultlen(lista));passo= incremento tra indici (default 1; può essere negativo).
nums = [10, 20, 30, 40, 50, 60]
print(nums[1:4]) # [20, 30, 40] (indici 1..3)
print(nums[:3]) # [10, 20, 30] (dall'inizio a 2)
print(nums[3:]) # [40, 50, 60] (da 3 alla fine)
Nota: Gli indici partono da 0. Nello slicing il limite destro (
fine) non è mai incluso.
Indici negativi
Indici negativi contano dalla fine: -1 è l’ultimo elemento.
nums = [10, 20, 30, 40, 50, 60]
print(nums[-1]) # 60 (ultimo)
print(nums[-3:]) # [40, 50, 60]
print(nums[:-2]) # [10, 20, 30, 40] (esclude gli ultimi due)
Passo (step) e slicing non contiguo
nums = [10, 20, 30, 40, 50, 60, 70]
print(nums[::2]) # [10, 30, 50, 70] (uno si', uno no)
print(nums[1::2]) # [20, 40, 60] (gli elementi in posizioni dispari)
Inversione rapida
nums = [1, 2, 3, 4]
print(nums[::-1]) # [4, 3, 2, 1]
Omissione dei limiti e out-of-range
Python gestisce in modo sicuro i limiti mancanti o fuori intervallo.
nums = [10, 20, 30, 40]
print(nums[0:100]) # [10, 20, 30, 40] (fine oltre la lunghezza)
print(nums[-100:2]) # [10, 20] (inizio troppo piccolo)
print(nums[:]) # copia superficiale della lista
Copia tramite slicing
a = [1, 2, 3]
b = a[:] # nuova lista (shallow copy)
b.append(99)
print(a, b) # [1, 2, 3] [1, 2, 3, 99]
Nota: È una copia superficiale: se la lista contiene oggetti mutabili (es. altre liste), questi sono condivisi.
Assegnazione e cancellazione con slice
Puoi modificare più elementi in una volta sola.
Assegnazione di slice
voti = [6, 7, 8, 9, 10]
voti[1:3] = [7.5, 8.5] # sostituisce le posizioni 1 e 2
print(voti) # [6, 7.5, 8.5, 9, 10]
voti[3:3] = [9.5, 9.8] # inserimento (slice vuoto)
print(voti) # [6, 7.5, 8.5, 9.5, 9.8, 9, 10]
# passi devono combaciare come quantita'
voti[::2] = [0, 0, 0, 0]
print(voti) # [0, 7.5, 0, 9.5, 0, 9, 0]
Cancellazione con del
nums = [10, 20, 30, 40, 50, 60]
del nums[1:4] # rimuove 20, 30, 40
print(nums) # [10, 50, 60]
Selezioni “a finestra” (windowing)
Estrarre blocchi consecutivi è utile per sottosequenze.
data = ["lun","mar","mer","gio","ven","sab","dom"]
weekdays = data[:5] # giorni feriali
weekend = data[-2:] # sabato e domenica
print(weekdays, weekend)
EC