Vai al contenuto
eLearner.app
Modulo 6 · Lezione 4 di 424/36 nel corso~12 min
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:

Python
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:

Python
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:

Python
dict(zip(nomi, eta))
# {'Ada': 36, 'Linus': 54, 'Grace': 85}

itertools.chain: concatenare iterabili

Python
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

Python
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:

Python
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

Esercizio#python.m6.l4.e1
Tentativi: 0Caricamento…

Date le liste parallele `countries = ['Italia', 'Francia', 'Spagna']` e `capitals = ['Roma', 'Parigi', 'Madrid']`, costruisci `mapping` come dict {paese: capitale}. Valuta `mapping`.

Caricamento editor…
Mostra suggerimento

dict(zip(countries, capitals))

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#python.m6.l4.e2
Tentativi: 0Caricamento…

Data `words = ['ciao', 'mondo', 'python']`, costruisci `enumerated_items` come lista di tuple (i, parola) partendo da i=1. Valuta `enumerated_items`.

Caricamento editor…
Mostra suggerimento

enumerate(parole, start=1) → tuple (i, valore).

Soluzione disponibile dopo 3 tentativi

Sfida aggiuntiva

Esercizio#python.m6.l4.e3
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Usa dict(zip(keys, values)) ed assegnalo a my_dict.

Soluzione disponibile dopo 3 tentativi