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}
>>>
Si utilizas numpy.unique usando el retorno return_counts = True te devuelve un array con el numero de veces que encontro cada elemento:
ResponderEliminar>>>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]))
Es una sugerencia a otra forma mas sencilla de hacerlo. Saludos
EliminarJusto lo que buscaba. Yo no diría sencilla, diría más eficiente cuando tienes miles de registros.
Eliminar