lettura facile

Il modulo collections di Python

Il modulo collections è una delle "gemme nascoste" del linguaggio Python, perché ti fornisce metodi e strutture di dati alternative e spesso più efficienti rispetto ai tipi base come liste, tuple e dizionari. In questo tutorial ne esploriamo alcune.

La classe Counter

La classe Counter è una sottoclasse del dizionario (dict) e serve per contare le occorrenze di ciascun elemento all'interno di un iterabile, come una lista.

Counter()

Immagina di avere un mucchio di oggetti e di voler sapere quanti ne hai di ciascun tipo.

La classe Counter fa proprio questo: conta le occorrenze di ogni elemento in un iterabile (come una lista) o in un mapping (come un dizionario).

Ad esempio, crea una lista con alcune stringhe che indicano dei colori.

lista = ['rosso', 'blu', 'rosso', 'verde', 'blu', 'blu']

Come puoi vedere, alcuni colori sono ripetuti.

Supponi di volerli contare. Puoi farlo usando la classe Counter()

  • from collections import Counter
  • conteggio = Counter(lista)
  • print(conteggio)

La classe Counter conta le occorrenze di ciascun elemento della lista e ti restituisce il risultato aggregato del conteggio.

Counter({'blu': 3, 'rosso': 2, 'verde': 1})

Nella lista ci sono 3 oggetti blu, 2 oggetti rossi e un oggetto verde.

La classe defaultdict

La classe defaultdict è una sottoclasse del dizionario (dict) standard di Python.

defaultdict()

La sua caratteristica principale è che fornisce un valore di default per le chiavi che non sono ancora state inserite.

Quando usi defaultdict, stai in realtà creando un nuovo oggetto della classe defaultdict.

A volte, quando cerchi una chiave in un dizionario che non esiste, vuoi che venga restituito un valore di default invece di un errore. la classe defaultdict fa proprio questo. Questo è utile quando non vuoi gestire manualmente le eccezioni o i controlli per le chiavi mancanti.

Ad esempio, immagina di voler creare un dizionario dove ogni chiave mancante avrà come valore di default la stringa "sconosciuto".

Definisci un dizionario dove associ una sigla a un paese.

countries = { 'UK': 'United Kingdom', 'FR': 'France', 'DE': 'Germany' }

Ora importa la classe defaultdect dal modulo collections.

 

from collections import defaultdict

Crea un oggetto defaultdict che prende i dati del dizionario e restituisce 'sconosciuto' per le chiavi non presenti

countries_default = defaultdict(lambda: 'sconosciuto', countries)

In questo esempio, defaultdict è inizializzato con il dizionario countries e una funzione lambda che restituisce 'sconosciuto'.

Quando provi ad accedere a un codice paese come 'IT' che non è presente nel dizionario originale, defaultdict restituisce automaticamente 'sconosciuto' invece di sollevare un errore KeyError.

print(countries_default['IT'])

'sconosciuto'

Questo rende la gestione delle chiavi mancanti molto più agevole e diretta.

OrderedDict

OrderedDict è una sottoclasse di dict (dizionario) che mantiene l'ordine in cui le chiavi vengono inserite.

OrderedDict()

Gli oggetti creati con questa classe sono anche detti dizionari ordinati (OrderedDect).

Nelle versioni di Python precedenti alla 3.7, i dizionari non mantenevano l'ordine degli elementi. Quindi, gli oggetti OrderedDict erano molto utili per preservare l'ordine delle chiavi.

Oggi, i normali dizionari mantengono l'ordine, ma OrderedDict è ancora utile per molte sue funzionalità aggiuntive, come il reordering degli elementi.

Ad esempio, importa la classe OrderedDict dal modulo collections.

from collections import OrderedDict

Poi crea un dizionario ordinato

dizionario_ordinato = OrderedDict([('rosso', 1), ('blu', 2)])

Aggiungi un ulteriore chiave al dizionario

dizionario_ordinato['verde'] = 3

Se stampi il dizionario ordinato, le chiavi sono visualizzate nello stesso ordine di inserimento

print(dizionario_ordinato)

OrderedDict([('rosso', 1), ('blu', 2), ('verde', 3)])

Nota che quando usi OrderedDict, stai in realtà creando un nuovo oggetto della classe OrderedDict e non un dizionario.

La classe deque

La classe deque ti permette di creare una lista dove puoi aggiungere e rimuovere gli elementi sia dall'inizio che dalla fine

deque()

In altre parole, questa classe definisce una struttura dati simile a una coda doppia (double-ended queue).

Ad esempio, importa la classe deque dal modulo collections.

from collections import deque

Poi crea un oggetto della classe deque con due elementi all'interno.

coda = deque(['rosso', 'blu'])

Aggiungi un elemento alla fine tramite il metodo append()

coda.append('verde')

Dopo questa modifica l'oggetto contiene tre elementi.

print(coda)

deque(['rosso', 'blu', 'verde'])

Ora aggiungi un elemento all'inizio tramite il metodo appendleft()

coda.appendleft('giallo')

Adesso la coda è composta da quattro elementi.

print(coda)

deque(['giallo', 'rosso', 'blu', 'verde'])

La classe namedtuple

Creare piccole classi per strutture di dati semplici può essere noioso. La classe namedtuple ti permette di creare rapidamente classi simili a tuple, ma con nomi di campi per un accesso più leggibile.

namedtuple()

Gli oggetti creati da questa classe sono oggetti di tipo namedtuple, anche noti come "tuple con nomi".

Ad esempio, importa la classe namedtuple dal modulo collections

from collections import namedtuple

Poi crea una tupla con nomi per creare una classe personalizzata chiamata "Punto".

Punto = namedtuple('Punto', ['x', 'y'])

Ora definisci un'istanza della classe "Punto" che hai appena creato.

p = Punto(11, y=22)

Una volta creato l'oggetto "p", puoi richiamare i suoi elementi indicando il nome dei campi "x" o "y" anziché la loro posizione negli indici.

print(p.y)

22

Queste spiegazioni ti danno un'idea di come il modulo collections può essere molto utile quando programmi in Python.




Se qualcosa non ti è chiaro, scrivi la tua domanda nei commenti.




FacebookTwitterLinkedinLinkedin