Páginas

martes, 2 de septiembre de 2014

Python: Como contar el numero de veces que un elemento aparece en una lista. Funcion collections.Counter()

Tengo un listado como por ejemplo:

1
2
3
4
4
5
6
6
7
8
9
9
10
11
12
12
12
13
14
14
15
15
15

Deseo contar cuantas veces se ha repetido cada numero:

Mi archivo se llama dictionary.txt, pimero creo una lista:

>>> lista = [item for item in open('dictionary.txt').readlines()]
>>> lista
['1\n', '2\n', '3\n', '4\n', '4\n', '5\n', '6\n', '6\n', '7\n', '8\n', '9\n', '9
\n', '10\n', '11\n', '12\n', '12\n', '12\n', '13\n', '14\n', '14\n', '15\n', '15
\n', '15']





Sin embargo al final de cada lista me aparece un simbolo de final de linea, el cual elimino de la siguiente manera:

>>> for item in lista:
...     if '\n'in item:
...             lista[lista.index(item)]=item.replace('\n', '')
...
>>> lista
['1', '2', '3', '4', '4', '5', '6', '6', '7', '8', '9', '9', '10', '11', '12', '
12', '12', '13', '14', '14', '15', '15', '15']


Ahora lo maravilloso, en el modulo collections existe una funcion llamada Counter, que crea un diccionario con los elementos de una lista y cuenta el numero de ocurrencias:

>>> diccionario= collections.Counter(lista)
>>>
>>> diccionario
Counter({'12': 3, '15': 3, '14': 2, '4': 2, '6': 2, '9': 2, '11': 1, '10': 1, '1
3': 1, '1': 1, '3': 1, '2': 1, '5': 1, '7': 1, '8': 1})


Si no te gusta que al comienzo aparezca la palabra Counter, pues conviertelo a diccionario con la funcion dict()

>>> diccionario = dict(diccionario)
>>> diccionario
{'11': 1, '10': 1, '13': 1, '12': 3, '15': 3, '14': 2, '1': 1, '3': 1, '2': 1, '
5': 1, '4': 2, '7': 1, '6': 2, '9': 2, '8': 1}
>>>

3 comentarios:

  1. Si utilizas numpy.unique usando el retorno return_counts = True te devuelve un array con el numero de veces que encontro cada elemento:
    >>>import numpy
    >>>a=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
    >>>numpy.unique(a,return_counts = True)
    (array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
    array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]))

    ResponderEliminar
    Respuestas
    1. Es una sugerencia a otra forma mas sencilla de hacerlo. Saludos

      Eliminar