Jump to content

Archived

This topic is now archived and is closed to further replies.

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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 [] 

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.