Python e dizionari: raggruppare dati con le chiavi multiple

by theArchitect
SHARE
Python e dizionari: raggruppare dati con le chiavi multiple
© Guida-HTML5.it

Introduzione

I dizionari sono una delle strutture dati più utili in Python perché permettono di associare una chiave a un valore in modo rapido e leggibile. Di solito li usiamo per cercare informazioni tramite un identificatore univoco, ad esempio un nome utente, un codice prodotto o un ID.

Un sotto-argomento molto pratico, spesso sottovalutato, è l’uso dei dizionari per raggruppare dati per categoria o per chiave derivata. In altre parole, invece di memorizzare i dati “in fila”, li organizziamo in gruppi logici: ordini per cliente, libri per autore, file per estensione, transazioni per mese e così via.

Questa tecnica è fondamentale quando devi:

  • riorganizzare una lista di record in una struttura più efficiente;
  • contare elementi per gruppo;
  • costruire report sintetici;
  • preparare dati per analisi o visualizzazioni.

In questo tutorial vedremo come usare i dizionari per raggruppare dati in modo pulito, con un esempio concreto basato su una lista di transazioni di e-commerce.

Codice completo

from collections import defaultdict

# Lista di transazioni: ogni elemento è un dizionario
transazioni = [
    {"id": 1, "cliente": "Anna", "categoria": "libri", "importo": 24.90},
    {"id": 2, "cliente": "Marco", "categoria": "tech", "importo": 199.99},
    {"id": 3, "cliente": "Anna", "categoria": "libri", "importo": 15.50},
    {"id": 4, "cliente": "Sara", "categoria": "casa", "importo": 42.00},
    {"id": 5, "cliente": "Marco", "categoria": "tech", "importo": 89.90},
    {"id": 6, "cliente": "Anna", "categoria": "casa", "importo": 18.75},
    {"id": 7, "cliente": "Sara", "categoria": "libri", "importo": 12.00},
]

# 1) Raggruppamento per categoria usando defaultdict(list)
raggruppate_per_categoria = defaultdict(list)

for transazione in transazioni:
    categoria = transazione["categoria"]
    raggruppate_per_categoria[categoria].append(transazione)

# 2) Calcolo del totale speso per cliente usando un dizionario normale
totale_per_cliente = {}

for transazione in transazioni:
    cliente = transazione["cliente"]
    importo = transazione["importo"]

    if cliente not in totale_per_cliente:
        totale_per_cliente[cliente] = 0.0

    totale_per_cliente[cliente] += importo

# 3) Conteggio delle transazioni per categoria
conteggio_per_categoria = {}

for transazione in transazioni:
    categoria = transazione["categoria"]
    conteggio_per_categoria[categoria] = conteggio_per_categoria.get(categoria, 0) + 1

# 4) Stampa dei risultati
print("=== Transazioni raggruppate per categoria ===")
for categoria, lista_transazioni in raggruppate_per_categoria.items():
    print(f"nCategoria: {categoria}")
    for t in lista_transazioni:
        print(f"  ID {t[´id´]} - Cliente: {t[´cliente´]} - Importo: €{t[´importo´]:.2f}")

print("n=== Totale speso per cliente ===")
for cliente, totale in totale_per_cliente.items():
    print(f"{cliente}: €{totale:.2f}")

print("n=== Numero di transazioni per categoria ===")
for categoria, conteggio in conteggio_per_categoria.items():
    print(f"{categoria}: {conteggio}")

Spiegazione

Il codice mostra tre modi diversi di usare i dizionari per aggregare dati. Sono tecniche molto comuni in applicazioni reali, soprattutto quando i dati arrivano da file JSON, database o API.

1. Raggruppare elementi con defaultdict(list)

La parte più interessante è questa:

raggruppate_per_categoria = defaultdict(list)

defaultdict appartiene al modulo collections e crea automaticamente un valore iniziale quando una chiave non esiste ancora. In questo caso, il valore iniziale è una lista vuota.

Quindi, quando eseguiamo:

raggruppate_per_categoria[categoria].append(transazione)

Python non solleva un errore, perché se la categoria non è presente crea subito una lista vuota e poi aggiunge la transazione. È una soluzione molto comoda per fare grouping.

2. Sommare valori per chiave

Il secondo caso riguarda il totale speso da ciascun cliente. Qui usiamo un dizionario normale:

totale_per_cliente = {}

Ad ogni transazione controlliamo se il cliente esiste già nel dizionario. Se non esiste, inizializziamo il totale a 0.0. Poi sommiamo l’importo corrente.

Questa logica è molto utile quando vuoi calcolare:

  • spesa totale per utente;
  • numero di accessi per giorno;
  • quantità vendute per prodotto;
  • ore lavorate per progetto.

3. Usare get() per contare

Nel conteggio delle transazioni per categoria usiamo il metodo:

conteggio_per_categoria.get(categoria, 0)

get() è molto utile perché restituisce un valore predefinito se la chiave non esiste. In questo caso, se la categoria non è ancora presente, otteniamo 0, a cui sommare 1.

La forma:

dizionario.get(chiave, valore_default)

è una delle più pratiche in Python quando vuoi scrivere codice compatto e sicuro.

Perché questo approccio è importante

Raggruppare dati con i dizionari ti permette di trasformare una struttura “piatta” in una struttura organizzata. Questo rende più semplice:

  • analizzare i dati;
  • generare report;
  • calcolare statistiche;
  • eseguire filtri per gruppo.

Inoltre, i dizionari offrono accesso medio in tempo costante, quindi sono adatti anche con dataset di dimensioni importanti.

Best practice

Quando lavori con dizionari per raggruppare dati, alcune abitudini migliorano molto la qualità del codice.

  • Scegli chiavi chiare e coerenti: usa nomi espliciti come categoria, cliente, mese, stato.
  • Preferisci defaultdict quando devi creare liste o insiemi per chiave: riduce il codice e gli errori.
  • Usa get() per incrementi semplici: è elegante e leggibile.
  • Evita strutture troppo annidate senza necessità: se il dizionario diventa difficile da leggere, valuta una classe o un dataclass.
  • Separa trasformazione e stampa: prima costruisci i dati aggregati, poi li presenti. Il codice sarà più manutenibile.
  • Valida i dati in ingresso: se una chiave manca, gestiscila in modo esplicito per evitare errori nascosti.

Un errore comune è scrivere logica di raggruppamento molto lunga dentro un unico ciclo senza commenti. Meglio spezzare il problema in piccoli passaggi: prima raggruppi, poi calcoli, poi mostri i risultati.

Riepilogo

I dizionari in Python non servono solo a salvare coppie chiave-valore: sono uno strumento potente per organizzare, raggruppare e aggregare dati. In questo tutorial hai visto come usarli per:

  • raggruppare record per categoria con defaultdict(list);
  • calcolare totali per chiave con un dizionario normale;
  • contare occorrenze con get().

Queste tecniche sono molto usate in script di automazione, analisi dati, backend web e pipeline di elaborazione. Se impari a padroneggiarle, i dizionari diventano uno degli strumenti più versatili del tuo kit Python.

Approfondisci con risorse ufficiali

SHARE