Python Set: eliminare elementi duplicati e mantenere l’ordine logico dei dati

by theArchitect
SHARE
Python Set: eliminare elementi duplicati e mantenere l’ordine logico dei dati
© Guida-HTML5.it

Introduzione

I set sono una delle strutture dati più utili di Python quando devi lavorare con collezioni di elementi unici. A differenza di liste e tuple, un set non ammette duplicati e offre operazioni molto rapide per verificare la presenza di un elemento, aggiungerlo o rimuoverlo.

In questo tutorial ci concentriamo su un sotto-argomento pratico e spesso trascurato: usare i set per filtrare dati in ingresso ed eliminare duplicati in modo efficiente. È un caso reale molto comune quando si ricevono dati da file, API, form utente o log applicativi.

Vedremo come combinare una lista con un set per ottenere un flusso di lavoro pulito, veloce e facile da mantenere. Il punto chiave è che il set non serve solo a “togliere duplicati”, ma anche a controllare se un valore è già stato processato, evitando lavoro inutile.

Codice completo

# Esempio: pulizia di un elenco di tag provenienti da un form o da un file
# Obiettivo:
# 1) normalizzare i dati
# 2) eliminare duplicati
# 3) preservare l´ordine di prima apparizione

def pulisci_tag(tag_grezzi):
    tag_unici = set()
    tag_finali = []

    for tag in tag_grezzi:
        # Normalizzazione: spazio rimosso e testo in minuscolo
        tag_normalizzato = tag.strip().lower()

        # Scarta stringhe vuote dopo la pulizia
        if not tag_normalizzato:
            continue

        # Se il tag non è ancora stato visto, lo aggiungiamo
        if tag_normalizzato not in tag_unici:
            tag_unici.add(tag_normalizzato)
            tag_finali.append(tag_normalizzato)

    return tag_finali


# Dati di esempio
tag_in_input = [
    "Python",
    "  python  ",
    "Data Science",
    "Machine Learning",
    "data science",
    "",
    "AI",
    "ai",
    "Machine Learning "
]

risultato = pulisci_tag(tag_in_input)

print("Tag puliti e unici:", risultato)

# Caso pratico: controllo rapido di elementi già processati
prodotti_elaborati = {"SKU-1001", "SKU-1004", "SKU-2007"}

nuovi_prodotti = ["SKU-1004", "SKU-3001", "SKU-2007", "SKU-9999"]

for sku in nuovi_prodotti:
    if sku in prodotti_elaborati:
        print(f"{sku} già elaborato, salto.")
    else:
        print(f"{sku} nuovo, procedo con l´elaborazione.")
        prodotti_elaborati.add(sku)

Spiegazione

Nel primo esempio, la funzione pulisci_tag riceve una lista di stringhe potenzialmente sporche: possono contenere spazi extra, maiuscole/minuscole incoerenti e duplicati. Questo è un problema molto comune nei dati reali.

1. Perché usare un set

Il set tag_unici ha una proprietà fondamentale: ogni elemento può comparire una sola volta. Questo lo rende perfetto per tenere traccia di ciò che è già stato visto. Quando il ciclo incontra un tag, verifica subito se è già presente nel set:

  • se non c’è, lo aggiunge al set e alla lista finale;
  • se c’è già, lo ignora.

In questo modo eviti duplicazioni senza dover confrontare ogni elemento con tutti gli altri, cosa che sarebbe più lenta con una lista normale.

2. Normalizzazione dei dati

Prima di controllare i duplicati, il codice usa strip() e lower():

  • strip() rimuove spazi iniziali e finali;
  • lower() converte il testo in minuscolo.

Questa fase è importante perché “Python”, “ python ” e “PYTHON” devono essere considerati lo stesso valore logico. Senza normalizzazione, il set li vedrebbe come elementi diversi.

3. Mantenere l’ordine

Un set puro non garantisce un ordine utile per l’output. Per questo il codice usa una seconda struttura, tagger_finali, che è una lista. La lista conserva l’ordine di prima apparizione, mentre il set si occupa del controllo rapido dei duplicati.

Questa combinazione è molto pratica: set per la velocità, lista per l’ordine.

4. Controllo di elementi già elaborati

Nel secondo blocco di codice, il set prodotti_elaborati viene usato come registro degli SKU già processati. Questo è un caso d’uso tipico nei sistemi batch, nelle pipeline dati o nei job schedulati.

La condizione if sku in prodotti_elaborati è molto efficiente. In pratica, puoi filtrare subito ciò che hai già visto, evitando elaborazioni duplicate, chiamate API inutili o scritture ripetute su database.

Best practice

  • Normalizza prima di inserire nel set: se i dati arrivano da fonti esterne, uniforma maiuscole/minuscole, spazi e formati prima del controllo.
  • Usa il set per il controllo, la lista per l’output ordinato: se l’ordine conta, non affidarti solo al set.
  • Evita di usare set con elementi mutabili: puoi inserire solo elementi hashable, come stringhe, numeri e tuple immutabili.
  • Scegli nomi chiari: ad esempio visti, elaborati, unici o già_processati aiutano a capire subito il ruolo del set.
  • Non convertire sempre tutto in set senza motivo: se ti serve solo l’ordine e non il controllo dei duplicati, una lista potrebbe essere più adatta.
  • Attenzione alla perdita di informazione: eliminare duplicati significa anche decidere quale versione del dato tenere. Per esempio, “Python” e “python” diventano uno solo dopo la normalizzazione.

Riepilogo

I set in Python sono uno strumento semplice ma molto potente quando devi gestire dati unici. In questo tutorial hai visto un uso pratico e concreto: filtrare dati in ingresso e eliminare duplicati in modo efficiente.

Il pattern più utile è questo:

  • usa un set per sapere rapidamente se un elemento è già stato visto;
  • usa una lista per conservare l’ordine degli elementi accettati;
  • normalizza i dati prima del controllo per evitare duplicati “falsi”.

Questa combinazione è ideale in scenari reali come pulizia di tag, gestione di SKU, importazione dati, deduplicazione di email o filtraggio di eventi già processati.

Approfondisci con risorse ufficiali

  • Documentazione ufficiale Python sui set: Built-in Types — set
  • Documentazione ufficiale Python sulle operazioni sugli insiemi: unione, intersezione, differenza e aggiornamenti
  • Documentazione ufficiale Python su hashability: utile per capire quali oggetti possono essere inseriti in un set
  • PEP 8: per scrivere codice più leggibile e coerente nei tuoi progetti

SHARE