Python e le liste: raggruppare, contare e aggregare dati con strumenti integrati

by theArchitect
SHARE
Python e le liste: raggruppare, contare e aggregare dati con strumenti integrati
© Guida-HTML5.it

Introduzione

Le liste sono una delle strutture dati più utilizzate in Python perché permettono di conservare una sequenza ordinata di valori. Oltre alle operazioni di base, una lista può essere usata come punto di partenza per analizzare dati: possiamo contare le occorrenze, raggruppare elementi, calcolare somme e medie oppure creare una tabella riassuntiva.

In questo tutorial analizzeremo un caso pratico: elaborare una lista di vendite rappresentate da dizionari. Ogni elemento conterrà il nome di un prodotto, la categoria, la quantità venduta e il prezzo unitario. Useremo liste e dizionari insieme, mantenendo il codice leggibile e facilmente estendibile.

L’obiettivo non è soltanto ottenere un risultato, ma imparare a costruire una piccola pipeline di elaborazione dati:

  • preparare una lista di record;
  • calcolare valori derivati;
  • aggregare i dati per categoria;
  • produrre un riepilogo finale.

Codice completo

# Dati di vendita: ogni dizionario rappresenta una riga di dati
vendite = [
    {"prodotto": "Tastiera", "categoria": "Accessori", "quantita": 4, "prezzo": 35.50},
    {"prodotto": "Mouse", "categoria": "Accessori", "quantita": 7, "prezzo": 18.90},
    {"prodotto": "Monitor", "categoria": "Display", "quantita": 2, "prezzo": 249.99},
    {"prodotto": "Webcam", "categoria": "Video", "quantita": 3, "prezzo": 59.90},
    {"prodotto": "Cuffie", "categoria": "Audio", "quantita": 5, "prezzo": 42.00},
    {"prodotto": "Microfono", "categoria": "Audio", "quantita": 2, "prezzo": 89.00},
    {"prodotto": "Hub USB", "categoria": "Accessori", "quantita": 6, "prezzo": 24.50},
]

# Aggiungiamo a ogni vendita il valore complessivo della riga
for vendita in vendite:
    vendita["totale"] = vendita["quantita"] * vendita["prezzo"]

# Creiamo un riepilogo per categoria
riepilogo = {}

for vendita in vendite:
    categoria = vendita["categoria"]

    # setdefault inizializza la categoria al primo utilizzo
    dati_categoria = riepilogo.setdefault(
        categoria,
        {"quantita_totale": 0, "incasso_totale": 0.0, "prodotti": []}
    )

    dati_categoria["quantita_totale"] += vendita["quantita"]
    dati_categoria["incasso_totale"] += vendita["totale"]
    dati_categoria["prodotti"].append(vendita["prodotto"])

# Stampiamo il riepilogo in modo leggibile
for categoria, dati in riepilogo.items():
    prodotti = ", ".join(dati["prodotti"])

    print(f"Categoria: {categoria}")
    print(f"  Prodotti: {prodotti}")
    print(f"  Quantità venduta: {dati[´quantita_totale´]}")
    print(f"  Incasso: {dati[´incasso_totale´]:.2f} euro")
    print()

Spiegazione

Liste di record

La variabile vendite è una lista i cui elementi sono dizionari. Questa combinazione è molto comune quando si lavora con dati provenienti da file CSV, API o database. La lista mantiene l’ordine dei record, mentre ogni dizionario associa un nome, come "prodotto" o "prezzo", al relativo valore.

Il vantaggio è la chiarezza. Scrivere vendita["quantita"] è più comprensibile rispetto a utilizzare indici numerici come vendita[2]. Inoltre, è possibile aggiungere nuovi campi senza modificare la struttura dell’intera lista.

Calcolo di valori derivati

Nel primo ciclo calcoliamo il valore totale di ogni vendita:

vendita["totale"] = vendita["quantita"] * vendita["prezzo"]

Il campo totale non era presente nei dati iniziali, ma viene aggiunto direttamente al dizionario. Questo è utile quando un valore deve essere riutilizzato più volte. In alternativa, potremmo calcolarlo ogni volta, ma il codice diventerebbe più ripetitivo.

Raggruppamento con un dizionario

La variabile riepilogo è un dizionario in cui ogni chiave è una categoria, per esempio "Accessori" o "Audio". Il valore associato è un altro dizionario contenente i totali e la lista dei prodotti.

Il metodo setdefault() permette di creare automaticamente una struttura iniziale quando una categoria compare per la prima volta:

dati_categoria = riepilogo.setdefault(
    categoria,
    {"quantita_totale": 0, "incasso_totale": 0.0, "prodotti": []}
)

Se la categoria esiste già, setdefault() restituisce il dizionario già presente senza sovrascriverlo. Se invece non esiste, inserisce il valore predefinito e lo restituisce. Questo evita di scrivere ogni volta un controllo con if categoria not in riepilogo.

Aggregazione dei dati

Una volta ottenuto il dizionario della categoria, aggiorniamo i valori aggregati. La quantità viene sommata e l’incasso viene incrementato usando il totale calcolato per la singola vendita. Il nome del prodotto viene aggiunto alla lista prodotti.

Questa tecnica è utile per report, dashboard, statistiche e controlli amministrativi. Le liste conservano i dettagli, mentre il dizionario di riepilogo rende immediato l’accesso ai totali.

Best practice

  • Usa nomi espliciti: nomi come vendite, categoria e incasso_totale rendono il codice autoesplicativo.
  • Mantieni omogenea la struttura dei dati: ogni dizionario della lista dovrebbe avere le stesse chiavi e valori di tipo coerente.
  • Separa raccolta ed elaborazione: prima definisci o acquisisci i dati, poi calcola i valori derivati e infine produci il report.
  • Presta attenzione ai numeri decimali: per applicazioni finanziarie importanti, il tipo float può introdurre piccoli errori di rappresentazione. In questi casi valuta il modulo decimal.
  • Evita strutture troppo profonde: liste di dizionari contenenti altri dizionari possono diventare difficili da mantenere. Se il modello cresce, considera classi o dataclass.
  • Non modificare una lista durante un ciclo se non è necessario: nell’esempio aggiorniamo i dizionari, ma non cambiamo il numero degli elementi della lista.
  • Usa funzioni per le operazioni ripetute: in un progetto reale puoi estrarre il calcolo del totale e il raggruppamento in funzioni separate, rendendo il codice più testabile.

Riepilogo

Le liste in Python diventano particolarmente potenti quando vengono combinate con dizionari e usate per rappresentare record strutturati. In questo esempio abbiamo costruito una lista di vendite, calcolato il totale di ogni elemento e creato un riepilogo per categoria.

Il metodo setdefault() ha semplificato l’inizializzazione dei gruppi, mentre le liste annidate hanno permesso di conservare l’elenco dei prodotti appartenenti a ciascuna categoria. Questo schema può essere adattato a molti contesti: ordini di un negozio, log applicativi, risultati scolastici, attività degli utenti o misurazioni raccolte da sensori.

Approfondisci con risorse ufficiali

SHARE