HOWTO · Python

Contare i valori univoci nella lista Python

Come contare i valori univoci in una lista Python

In questa pagina

Un modo semplice per contare i valori univoci in una lista Python è usare len(set(values)), che funziona quando gli elementi della lista sono hashable: lo sono, per esempio, numeri, stringhe e tuple i cui elementi siano tutti hashable. Se vuoi sapere anche quante volte compare ciascun valore, collections.Counter fornisce in un solo passaggio il conteggio dei valori distinti e le relative frequenze; numpy.unique è invece una scelta naturale se i dati sono già memorizzati in un array NumPy. In questo articolo vedremo tutti e tre gli approcci e come scegliere tra loro.

Contare i valori univoci con set()

La funzione integrata set() converte una lista in un insieme, che conserva una sola copia di ogni valore distinto. Applicando len() al risultato ottieni il numero di valori univoci senza importare moduli aggiuntivi.

Esegui questo esempio: il codice e le etichette o gli output visibili restano in inglese.

values = [1, 2, 2, 3, 4, 4, 5]
unique_values = set(values)

print(len(unique_values))

Risultato:

5

set(values) elimina i 2 e i 4 ripetuti; len() restituisce quindi il numero degli elementi rimasti. Gli elementi in input devono essere hashable: se la lista contiene elementi come altre liste o dizionari, Python genera un TypeError. Tieni presente anche che un insieme non conserva l’ordine originale della lista, quindi risponde alla domanda «quanti?» ma non a «quale è comparso per primo?». Se ti servono i valori univoci nell’ordine della prima comparsa, usa invece list(dict.fromkeys(values)): la sua lunghezza corrisponde allo stesso conteggio dei valori distinti.

Contare i valori univoci con collections.Counter

collections.Counter è una classe simile a un dizionario che conta quante volte compare ciascun elemento di un iterabile. È lo strumento adatto quando vuoi ottenere contemporaneamente il conteggio dei valori distinti e la frequenza di ciascuno.

Esegui questo esempio: il codice e le etichette o gli output visibili restano in inglese.

from collections import Counter

values = ["apple", "banana", "apple", "orange", "banana", "kiwi"]
counter = Counter(values)

print(len(counter))
print(dict(counter))

Risultato:

4
{'apple': 2, 'banana': 2, 'orange': 1, 'kiwi': 1}

counter associa ogni valore alla sua frequenza, perciò len(counter) conta le chiavi distinte: in questa lista sono quattro. Accedere al contatore con un indice, ad esempio counter["apple"], restituisce la frequenza di un singolo valore; counter.most_common(1) restituisce invece l’elemento più frequente. Come set(), anche collections.Counter richiede elementi hashable ed è inclusa nella libreria standard.

Contare i valori univoci con NumPy

NumPy è un pacchetto di terze parti, installabile con pip install numpy. La funzione numpy.unique restituisce i valori univoci ordinati di un input simile a un array. La dimensione del risultato corrisponde al conteggio dei valori distinti; passando return_counts=True ottieni anche la frequenza di ciascun valore.

Esegui questo esempio: il codice e le etichette o gli output visibili restano in inglese.

import numpy as np

values = np.array([1, 2, 2, 3, 4, 4, 5])
unique_values, counts = np.unique(values, return_counts=True)

print(len(unique_values))
for value, count in zip(unique_values, counts):
    print(value, count)

Risultato:

5
1 1
2 2
3 1
4 2
5 1

Qui unique_values contiene i cinque numeri distinti in ordine crescente, mentre counts indica quante volte è comparso ciascuno: 2 e 4 compaiono entrambi due volte. Poiché numpy.unique ordina i risultati, è adatta anche quando ti servono i valori distinti in ordine. Sceglila se i dati sono già in un array NumPy o se il progetto usa già NumPy; per una normale lista Python, l’approccio con set() evita questa dipendenza aggiuntiva.

Scegliere l’approccio giusto

Tutti e tre gli approcci restituiscono lo stesso conteggio dei valori distinti. Scegli quindi quello più adatto al tuo input e alle informazioni aggiuntive che ti servono:

  • Usa set() se ti serve soltanto contare elementi distinti e hashable e vuoi la soluzione più breve basata sulla sola libreria standard.
  • Usa collections.Counter se vuoi conoscere anche la frequenza di ogni valore, gli elementi più comuni o altri conteggi per singolo valore.
  • Usa numpy.unique se i dati sono già in un array NumPy o se vuoi i valori univoci ordinati; aggiungi return_counts=True per ottenere le frequenze.

Qualunque approccio tu scelga, la decisione dipende dalle informazioni aggiuntive che ti servono — frequenze, risultati ordinati o nessuna dipendenza extra — non dal conteggio in sé, che tutti e tre forniscono allo stesso modo.