Cómo contar elementos óptimamente en una lista de Python
Esta es casi la misma pregunta queaquí, excepto que estoy preguntando sobre la solución más eficiente para un resultado ordenado.
Tengo una lista (aproximadamente 10 enteros al azar entre 0 y 12), por ejemplo:
the_list = [5, 7, 6, 5, 5, 4, 4, 7, 5, 4]
Quiero crear una función que devuelva una lista de tuplas (elemento, recuento) ordenadas por el primer elemento, por ejemplo
output = [(4, 3), (5, 4), (6, 1), (7, 2)]
Hasta ahora he usado:
def dupli(the_list):
return [(item, the_list.count(item)) for item in sorted(set(the_list))]
Pero llamo a esta función casi un millón de veces y necesito hacerlo tan rápido como pueda (python). Por lo tanto mi pregunta:¿Cómo hacer que esta función consuma menos tiempo? (¿Qué pasa con la memoria?)
He jugado un poco, pero no apareció nada obvio:
from timeit import Timer as T
number=10000
setup = "the_list=[5, 7, 6, 5, 5, 4, 4, 7, 5, 4]"
stmt = "[(item, the_list.count(item)) for item in sorted(set(the_list))]"
T(stmt=stmt, setup=setup).timeit(number=number)
Out[230]: 0.058799982070922852
stmt = "L = []; \nfor item in sorted(set(the_list)): \n L.append((item, the_list.count(item)))"
T(stmt=stmt, setup=setup).timeit(number=number)
Out[233]: 0.065041065216064453
stmt = "[(item, the_list.count(item)) for item in set(sorted(the_list))]"
T(stmt=stmt, setup=setup).timeit(number=number)
Out[236]: 0.098351955413818359
Gracias
Christophe