Dado um item, como posso contar suas ocorrências em uma lista no Python?
1530
Se você deseja apenas a contagem de um item, use o count
método:
>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3
Não use isso se quiser contar vários itens. A chamada count
em loop requer uma passagem separada sobre a lista para cada count
chamada, o que pode ser catastrófico para o desempenho. Se você deseja contar todos os itens, ou mesmo apenas vários itens, use Counter
, conforme explicado nas outras respostas.
mylist = [1,7,7,7,3,9,9,9,7,9,10,0] print sorted(set([i for i in mylist if mylist.count(i)>2]))
Use
Counter
se você estiver usando Python 2.7 ou 3.x e desejar o número de ocorrências para cada elemento:fonte
isinstance
. Portanto, se você tiver certeza dos dados com os quais está trabalhando, talvez seja melhor escrever uma função personalizada sem verificação de tipo e instância.isinstance
chama? Mesmo com milhões de strings, a chamadaCounter
envolve apenas umaisinstance
chamada, para verificar se o argumento é um mapeamento. Você provavelmente julgou mal o que está comendo o tempo todo.Counter
passou a contar iteráveis grandes, em vez de contar muitos iteráveis. Contar um iterável de um milhão de strings será mais rápido doCounter
que com uma implementação manual. Se você quiser ligarupdate
com muitas iteráveis, poderá acelerar as coisas juntando-as a uma iterávelitertools.chain
.Contando as ocorrências de um item em uma lista
Para contar as ocorrências de apenas um item da lista, você pode usar
count()
Contando as ocorrências de todos itens de uma lista também é conhecido como "calcular" uma lista ou criar um contador de contagem.
Contando todos os itens com count ()
Contar as ocorrências de itens em
l
um pode simplesmente usar uma compreensão de lista e ocount()
método(ou similarmente com um dicionário
dict((x,l.count(x)) for x in set(l))
)Exemplo:
Contando todos os itens com Counter ()
Como alternativa, há a
Counter
classe mais rápida dacollections
bibliotecaExemplo:
Quanto mais rápido é o contador?
Eu verifiquei o quão mais rápido
Counter
é para listas de cálculo. Eu tentei ambos os métodos com alguns valores den
e parece queCounter
é mais rápido por um fator constante de aproximadamente 2.Aqui está o script que eu usei:
E a saída:
fonte
Counter
é muito mais rápido para listas maiores. O método de compreensão da lista é O (n ^ 2),Counter
deve ser O (n).isinstance
. Portanto, se você tiver certeza dos dados com os quais está trabalhando, talvez seja melhor escrever uma função personalizada sem verificação de tipo e instância.Outra maneira de obter o número de ocorrências de cada item, em um dicionário:
fonte
n * (number of different items)
operações, sem contar o tempo necessário para construir o conjunto. Usarcollections.Counter
é realmente muito melhor.i
, porque ela tentará inserir várias chaves do mesmo valor em um dicionário.dict((i, a.count(i)) for i in a)
list.count(x)
retorna o número de vezes quex
aparece em uma listaconsulte: http://docs.python.org/tutorial/datastructures.html#more-on-lists
fonte
Aqui está uma lista de exemplos:
list.count
Existe o
list.count
métodoIsso funciona bem para qualquer lista. As tuplas também têm esse método:
collections.Counter
E depois há coleções. Você pode despejar qualquer iterável em um contador, não apenas em uma lista, e o contador manterá uma estrutura de dados das contagens dos elementos.
Uso:
Os contadores são baseados em dicionários Python; suas chaves são os elementos; portanto, as chaves precisam ser laváveis. Eles são basicamente como conjuntos que permitem elementos redundantes neles.
Uso adicional de
collections.Counter
Você pode adicionar ou subtrair com iterables do seu contador:
E você também pode executar operações de vários conjuntos com o contador:
Por que não pandas?
Outra resposta sugere:
O Pandas é uma biblioteca comum, mas não está na biblioteca padrão. Adicioná-lo como um requisito não é trivial.
Existem soluções internas para esse caso de uso no próprio objeto de lista e na biblioteca padrão.
Se seu projeto ainda não requer pandas, seria tolice torná-lo um requisito apenas para esta funcionalidade.
fonte
Comparei todas as soluções sugeridas (e algumas novas) com perfplot (um pequeno projeto meu).
Contando um item
Para matrizes grandes o suficiente, acontece que
é um pouco mais rápido que as outras soluções.
Contando tudo itens
Conforme estabelecido anteriormente ,
é o que você quer.
Código para reproduzir as parcelas:
2)
fonte
Se você quiser contar todos os valores de uma só vez, poderá fazê-lo muito rapidamente usando matrizes numpy e da
bincount
seguinte maneiraque dá
fonte
Se você pode usar
pandas
, entãovalue_counts
existe para resgatar.Também classifica automaticamente o resultado com base na frequência.
Se você deseja que o resultado esteja em uma lista de listas, faça o seguinte:
fonte
Por que não usar Pandas?
Resultado:
Se você estiver procurando uma contagem de um elemento específico, diga a , tente:
Resultado:
fonte
Hoje eu tive esse problema e rolei minha própria solução antes de pensar em verificar o SO. Este:
é muito, muito lento para grandes listas. Minha solução
é realmente um pouco mais rápido que a solução Counter, pelo menos para o Python 2.7.
fonte
fonte
Abaixo estão as três soluções:
O mais rápido é usar um loop for e armazená-lo em um Dict.
Resultado
fonte
Contagem de todos os elementos com
itertools.groupby()
Outra possibilidade de obter a contagem de todos os elementos da lista pode ser por meio de
itertools.groupby()
.Com contagens "duplicadas"
Devoluções
Observe como ele combinou os três primeiros
a
como o primeiro grupo, enquanto outros grupos dea
estão presentes mais abaixo na lista. Isso acontece porque a lista de entradaL
não foi classificada. Às vezes, isso pode ser um benefício se os grupos forem de fato separados.Com contagens únicas
Se desejar contagens únicas de grupos, basta classificar a lista de entradas:
Devoluções
Nota: Para criar contagens exclusivas, muitas das outras respostas fornecem código mais fácil e mais legível em comparação com a
groupby
solução. Mas é mostrado aqui para desenhar um paralelo ao exemplo de contagem duplicada.fonte
Foi sugerido o uso da contagem de números de um número , no entanto, ele funciona apenas para matrizes 1d com números inteiros não negativos . Além disso, a matriz resultante pode ser confusa (contém as ocorrências dos números inteiros de min a max da lista original e define como 0 os números inteiros ausentes).
Uma maneira melhor de fazer isso com numpy é usar a função exclusiva com o atributo
return_counts
definido como True. Retorna uma tupla com uma matriz dos valores exclusivos e uma matriz das ocorrências de cada valor exclusivo.e então podemos emparelhá-los como
Também funciona com outros tipos de dados e "listas 2d", por exemplo
fonte
Para contar o número de diversos elementos com um tipo comum:
dá
3
, não 6fonte
Embora seja uma pergunta muito antiga, mas como não encontrei uma linha, fiz uma.
fonte
Você também pode usar o
countOf
método de um módulo internooperator
.fonte
countOf
é implementado? Como ele se compara ao mais óbviolist.count
(que se beneficia da implementação C)? Existem vantagens?Pode não ser o mais eficiente, requer uma passagem extra para remover duplicatas.
Implementação funcional:
retorna:
ou retorne como
dict
:retorna:
fonte
Isso retornará a quantidade de ocorrências do seu_valor
fonte
Eu usaria
filter()
, pegue o exemplo de Lukasz:fonte
se você deseja várias ocorrências para o elemento específico:
fonte
fonte
isso contará recursivamente ou procurará o item na lista, mesmo que ele esteja na lista de listas
fonte