Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dan Cm

[Resolvido] Qual a melhor forma de contar ocorrências em uma list

Recommended Posts

Eu tentei da seguinte forma, mas acho que não deve ser recomendável em questão de desempenho.

 

#-*- coding: utf-8 -*-
lista = [3, 0, 0, 0, 1, 1, 1, 0, 3, 3, 3]

total = []
contagem = []
for ocorrencia in lista:
if total.count(ocorrencia) == 0:
	total.append(ocorrencia)
	contagem.append(lista.count(ocorrencia))

print total
print contagem

 

Saída: printf.gif

 

Essa é uma forma razoável de se contar os números? Qual seria a melhor?

 

puts, postei na categoria errada :wacko: . É em Python isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A maneira mais "pythonica" que eu conheço é essa:

 

lista = [3, 0, 0, 0, 1, 1, 1, 0, 3, 3, 3]
print {x:lista.count(x) for x in set(lista)}

 

A última linha usa o tipo set (conjunto) p/ eliminar os elementos repetidos e coloca tudo num dict comprehension.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não imaginava que isso poderia ser feito de forma tão simples. Ainda não entendi bem isso de comprehension, mas vou pesquisar mais.

 

Obrigado. :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só mais uma coisa...

Você pode medir o tempo de execução com o comando python -m cProfile programa.py.

Isso serve p/ você "tirar a prova dos 9" se estiver vendo discussões sobre o que é mais rápido na linguagem. Mas tenha em mente que otimização prematura é a raiz de todo o mal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue outra solução, desta vez em Haskell:

 

Se houver relação de ordem entre os elementos da lista sendo processada, você pode usar:

import Data.Listcount :: (Eq a, Ord a) => [a] -> [(a, Int)]count = map wrap . group . sort            where wrap g = (head g, length g)

Senão, pode usar esta solução que, apesar de menos elegante, não precisa da restrição Ord a:

 

increment :: (Eq a) => [(a, Int)] -> a -> [(a, Int)]increment counts elt | lookup elt counts == Nothing = (elt, 1) : counts                     | otherwise = map incIfTarget counts                        where incIfTarget (x, count) | x == elt = (x, count + 1)                                                     | otherwise = (x, count)count :: (Eq a) => [a] -> [(a, Int)]count = foldl increment [] 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.