HOWTO · Python
Contar valores únicos na lista Python
Contar valores únicos na lista Python
Nesta página
Uma forma simples de contar os valores únicos de uma lista Python é usar len(set(values)). Funciona sempre que os elementos da lista são hashable — por exemplo, números, strings e tuplos cujos elementos também sejam hashable. Se precisar de saber quantas vezes aparece cada valor, collections.Counter fornece, numa só passagem, a contagem dos valores distintos e a frequência de cada um; numpy.unique é uma opção natural quando os dados já estão guardados num array NumPy. Este artigo apresenta as três abordagens e explica como escolher entre elas.
Contar valores únicos com set()
A função incorporada set() converte uma lista num conjunto, que guarda cada valor distinto apenas uma vez. Ao aplicar len() ao resultado, obtém a contagem de valores únicos sem importações adicionais.
Execute este exemplo. O código e os valores apresentados permanecem em inglês.
values = [1, 2, 2, 3, 4, 4, 5]
unique_values = set(values)
print(len(unique_values))
Saída:
5
set(values) elimina os valores 2 e 4 repetidos; em seguida, len() indica quantos elementos restam. Os elementos da lista têm de ser hashable — o Python gera um TypeError se a lista contiver elementos como outras listas ou dicionários. Tenha também em conta que um conjunto não preserva a ordem original da lista: responde a «quantos», mas não a «qual apareceu primeiro». Se precisar dos valores únicos pela ordem em que aparecem pela primeira vez, use antes list(dict.fromkeys(values)); o comprimento dessa lista corresponde à mesma contagem de valores distintos.
Contar valores únicos com collections.Counter
collections.Counter é uma classe semelhante a um dicionário que conta quantas vezes ocorre cada elemento de um iterável. É a opção indicada quando pretende obter ao mesmo tempo a contagem dos valores distintos e a frequência de cada valor.
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
from collections import Counter
values = ["apple", "banana", "apple", "orange", "banana", "kiwi"]
counter = Counter(values)
print(len(counter))
print(dict(counter))
Saída:
4
{'apple': 2, 'banana': 2, 'orange': 1, 'kiwi': 1}
counter associa cada valor à respetiva frequência, por isso len(counter) conta as chaves distintas — quatro nesta lista. Aceder ao contador por índice, por exemplo com counter["apple"], devolve a frequência de um valor; counter.most_common(1) devolve o item mais frequente. Tal como set(), collections.Counter funciona com elementos hashable e faz parte da biblioteca padrão.
Contar valores únicos com NumPy
NumPy é um pacote de terceiros (instale-o com pip install numpy) cuja função numpy.unique devolve os valores únicos, ordenados, de uma entrada semelhante a um array. O tamanho do resultado corresponde à contagem de valores distintos; se passar return_counts=True, a função também devolve a frequência de cada valor.
O código e os valores apresentados neste exemplo permanecem em inglês.
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)
Saída:
5
1 1
2 2
3 1
4 2
5 1
Aqui, unique_values contém os cinco números distintos por ordem crescente, e counts indica quantas vezes ocorreu cada um — 2 e 4 aparecem duas vezes cada. Como numpy.unique ordena o resultado, também é adequada quando precisa dos valores distintos por ordem. Use-a quando os dados já estiverem num array NumPy ou quando já depender de NumPy; para uma lista Python simples, a abordagem com set() evita essa dependência adicional.
Escolher a abordagem certa
As três abordagens produzem a mesma contagem de valores distintos. Escolha a que melhor se adapta aos dados de entrada e às informações de que precisa:
- Use
set()quando precisar apenas de contar elementos distintos e hashable e quiser a solução mais curta que usa somente a biblioteca padrão. - Use
collections.Counterquando também precisar da frequência de cada valor, dos elementos mais comuns ou de outras contagens por valor. - Use
numpy.uniquequando os dados já estiverem num array NumPy ou quando quiser os valores únicos ordenados; passereturn_counts=Truepara obter as frequências.
Seja qual for a abordagem, a escolha depende das informações adicionais de que precisa — frequências, resultados ordenados ou ausência de dependências adicionais — e não da contagem, que as três calculam da mesma forma.