Lezioni del modulo (4/4)
itertools essenziali
Python espone moltissimi tool di iterazione: alcuni sono built-in
(sempre disponibili), altri vivono nel modulo itertools della standard
library. Ecco i più importanti.
enumerate: indice + valore
Quando ti serve sia l'indice che l'elemento durante un loop:
for i, parola in enumerate(["a", "b", "c"]):
print(i, parola)
# 0 a
# 1 b
# 2 c
# parte da un altro numero:
for i, parola in enumerate(["a", "b", "c"], start=1):
print(i, parola)zip: iterare in parallelo
Combina più iterabili elemento per elemento:
nomi = ["Ada", "Linus", "Grace"]
eta = [36, 54, 85]
for n, e in zip(nomi, eta):
print(f"{n} ha {e} anni")zip si ferma all'iterabile più corto. Per zip "lungo" usa
itertools.zip_longest.
Costruire un dict da due liste parallele:
dict(zip(nomi, eta))
# {'Ada': 36, 'Linus': 54, 'Grace': 85}itertools.chain: concatenare iterabili
from itertools import chain
list(chain([1, 2], [3, 4], [5]))
# [1, 2, 3, 4, 5]Senza creare una lista intermedia: utile per file, generatori, ecc.
itertools.count e repeat: iteratori infiniti
from itertools import count, repeat
# count(start, step) — interi crescenti infiniti
for i in count(10, 2):
if i > 20: break
print(i)
# 10, 12, 14, 16, 18, 20
# repeat(x, n) — ripete lo stesso valore n volte (o all'infinito senza n)
list(repeat("ok", 3)) # ['ok', 'ok', 'ok']itertools.combinations
Tutte le combinazioni (senza ripetizioni, ordine indifferente) di lunghezza data:
from itertools import combinations
list(combinations([1, 2, 3, 4], 2))
# [(1,2), (1,3), (1,4), (2,3), (2,4), (3,4)]Variante con ordine: permutations. Variante con ripetizioni:
combinations_with_replacement e product.
zip() per dizionari ed elementi spaiati
La funzione zip() si ferma non appena l'iterabile più corto si esaurisce. Se desideri accoppiare elementi mantenendo anche quelli in eccesso (riempiendoli con un valore di default come None), puoi usare zip_longest() importandola dal modulo itertools. In più, puoi passare un risultato di zip() direttamente a dict() per creare al volo una mappa chiave-valore.
Prova tu
Date le liste parallele `countries = ['Italia', 'Francia', 'Spagna']` e `capitals = ['Roma', 'Parigi', 'Madrid']`, costruisci `mapping` come dict {paese: capitale}. Valuta `mapping`.
Mostra suggerimento
dict(zip(countries, capitals))
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
Data `words = ['ciao', 'mondo', 'python']`, costruisci `enumerated_items` come lista di tuple (i, parola) partendo da i=1. Valuta `enumerated_items`.
Mostra suggerimento
enumerate(parole, start=1) → tuple (i, valore).
Soluzione disponibile dopo 3 tentativi
Sfida aggiuntiva
Date le due liste `keys = ['a', 'b', 'c']` e `values = [10, 20, 30]`, usa `zip` per accoppiarle e converte il risultato in un dizionario. Salva il dizionario risultante in `my_dict` e valutalo.
Mostra suggerimento
Usa dict(zip(keys, values)) ed assegnalo a my_dict.
Soluzione disponibile dopo 3 tentativi