La forma más rápida de contar el número de ocurrencias en una lista de Python

Tengo una lista de Python y quiero saber cuál es la forma más rápida de contar el número de apariciones del elemento, '1' en esta lista. En mi caso real, el artículo puede ocurrir decenas de miles de veces, por lo que quiero una manera rápida.

 ['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10'] 

¿Ayuda el módulo de collections ? Estoy usando Python 2.7

 a = ['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10'] print a.count("1") 

Probablemente está optimizado en gran medida en el nivel C.

Edición: Generé aleatoriamente una lista grande.

 In [8]: len(a) Out[8]: 6339347 In [9]: %timeit a.count("1") 10 loops, best of 3: 86.4 ms per loop 

Editar edición: Esto se podría hacer con colecciones.

 a = Counter(your_list) print a['1'] 

Usando la misma lista en mi último ejemplo de tiempo

 In [17]: %timeit Counter(a)['1'] 1 loops, best of 3: 1.52 s per loop 

Mi tiempo es simplista y está condicionado por muchos factores diferentes, pero te da una buena pista en cuanto al rendimiento.

Aquí hay algunos perfiles

 In [24]: profile.run("a.count('1')") 3 function calls in 0.091 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.091 0.091 :1() 1 0.091 0.091 0.091 0.091 {method 'count' of 'list' objects} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Prof iler' objects} In [25]: profile.run("b = Counter(a); b['1']") 6339356 function calls in 2.143 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 2.143 2.143 :1() 2 0.000 0.000 0.000 0.000 _weakrefset.py:68(__contains__) 1 0.000 0.000 0.000 0.000 abc.py:128(__instancecheck__) 1 0.000 0.000 2.143 2.143 collections.py:407(__init__) 1 1.788 1.788 2.143 2.143 collections.py:470(update) 1 0.000 0.000 0.000 0.000 {getattr} 1 0.000 0.000 0.000 0.000 {isinstance} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Prof iler' objects} 6339347 0.356 0.000 0.356 0.000 {method 'get' of 'dict' objects} 

Mediante el uso del Diccionario de contador contando las ocurrencias de todos los elementos, así como el elemento más común en la lista de python con su valor de aparición de la manera más eficiente.

Si nuestra lista de python es: –

 l=['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10'] 

Para encontrar la ocurrencia de cada elemento en la lista de python, use lo siguiente:

 \>>from collections import Counter \>>c=Counter(l) \>>print c Counter({'1': 6, '2': 4, '7': 3, '10': 2}) 

Para encontrar la mayor o más alta ocurrencia de elementos en la lista de python: –

 \>>k=c.most_common() \>>k [('1', 6), ('2', 4), ('7', 3), ('10', 2)] 

Para el más alto : –

 \>>k[0][1] 6 

Para el artículo solo usa k [0] [0]

 \>>k[0][0] '1' 

Para el artículo n más alto y su no de ocurrencia en el uso de la lista siga: –

** para n = 2 **

 \>>print k[n-1][0] # For item 2 \>>print k[n-1][1] # For value 4 

La combinación de la función lambda y el mapa también puede hacer el trabajo:

 list_ = ['a', 'b', 'b', 'c'] sum(map(lambda x: x=="b", list_)) :2 

Puedes usar pandas , transformando la list a un pd.Series simplemente usa .value_counts()

 import pandas as pd a = ['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10'] a_cnts = pd.Series(a).value_counts().to_dict() Input >> a_cnts["1"], a_cnts["10"] Output >> (6, 2) 

Puede convertir la lista en una cadena con elementos separados por espacio y dividirla según el número / carácter a buscar.

Será limpio y rápido para la lista grande ..

 >>>L = [2,1,1,2,1,3] >>>strL = " ".join(str(x) for x in L) >>>strL 2 1 1 2 1 3 >>>count=len(strL.split(" 1"))-1 >>>count 3