python liste slicing strutture-dati

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, default len(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)