Uma operação bastante comum em várias aplicações é a contagem da frequência da ocorrência de valores em uma determinada lista. Para facilitar nossa vida, o Python traz em sua biblioteca padrão a classe Counter
, que é parte do módulo collections
.
O uso de Counter
é bastante simples: para instanciar a classe, passamos uma sequência qualquer como argumento para seu construtor. Vamos supor que queremos saber quantas vezes cada caractere aparece na frase “o rato roeu a roupa do rei de roma”. Como uma string é uma sequência, podemos fazer:
>>> from collections import Counter >>> c = Counter('o rato roeu a roupa do rei de roma') >>> c Counter({' ': 8, 'o': 6, 'r': 5, 'a': 4, 'e': 3, 'd': 2, 'u': 2, 'i': 1, 'm': 1, 'p': 1, 't': 1})
Como podemos ver, o caractere mais frequente é ‘ ‘ (espaço), com 8 ocorrências, seguido por ‘o’ com 6, depois por ‘r’ com 5 e assim por diante.
Counter
é uma subclasse de dict
, portanto podemos acessar seus elementos por meio de índices, do mesmo jeito que fazemos com dicionários. Isso é útil quando queremos saber qual a contagem específica de um determinado elemento. Por exemplo, para saber a frequência apenas da letra ‘r’, fazemos:
>>> c['r'] 5
Entre outros métodos, a classe Counter
oferece o most_common([n])
que, como seu nome descreve, retorna as n ocorrências mais frequentes da sequência. Então para saber, por exemplo, quais foram os dois times com mais títulos da NBA nos últimos dez anos, bastaria fazer:
>>> nba = ['San Antonio Spurs', 'Detroit Pistons', 'San Antonio Spurs', 'Miami Heat', 'San Antonio Spurs', 'Boston Celtics', 'Los Angeles Lakers', 'Los Angeles Lakers', 'Dallas Mavericks', 'Miami Heat'] >>> Counter(nba).most_common(2) [('San Antonio Spurs', 3), ('Los Angeles Lakers', 2)]
Note que, em caso de elementos com o mesmo número de ocorrências (“Los Angeles Lakers” e “Miami Heat”, nesse exemplo), a ordenação é aleatória.
Legal! Eliminei os espaços em branco com ‘replace’. Tava mesmo precisando de um código desse:
In [9]: from collections import Counter
In [10]: c = Counter(‘o rato roeu a roupa do rei de roma’.replace(‘ ‘,”))
In [11]: c
Out[11]: Counter({‘o’: 6, ‘r’: 5, ‘a’: 4, ‘e’: 3, ‘d’: 2, ‘u’: 2, ‘i’: 1, ‘m’: 1, ‘p’: 1, ‘t’: 1})
Bacana ter sido útil, Ivanelson! Valeu!