python list repetition

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



repetition (4)

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

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

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'']

¿El módulo de collections ayuda? Estoy usando Python 2.7


Mediante el uso de Counter dictionary, se cuentan las ocurrencias de todos los elementos y el elemento más común en la lista de Python con su valor de ocurrencia 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 ítem 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 / mayor 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 simplemente use k [0] [0]

/>>k[0][0] ''1''

Para el enésimo ítem más alto y su no aparición en la lista, use lo siguiente:

** para n = 2 **

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


Puede convertir la lista en cadena con los elementos separados por espacio y dividirla en función del número / char para buscar.

Será limpio y rápido para una gran lista.

>>>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


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

Es probable que esté optimizado en gran medida en el nivel C.

Editar: Genere aleatoriamente una gran lista.

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 podría hacerse con collections.Counter

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

Usar la misma lista en mi último ejemplo de sincronización

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

Mi tiempo es simplista y condicional en muchos factores diferentes, pero te da una buena pista sobre el 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 <string>:1(<module>) 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 <string>:1(<module>) 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}