Pregunta ¿Cómo contar las ocurrencias de un elemento de la lista?


Dado un elemento, ¿cómo puedo contar sus ocurrencias en una lista en Python?


1084
2018-04-08 13:30


origen


Respuestas:


Si solo quiere el conteo de un artículo, use el count método:

>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3

No lo hagas use esto si quiere contar varios elementos. Vocación count en un ciclo requiere un pase separado sobre la lista para cada count llamada, que puede ser catastrófico para el rendimiento. Si desea contar todos los artículos, o incluso solo varios artículos, use Counter, como se explica en las otras respuestas.


1425
2018-04-08 13:31



Si está utilizando Python 2.7 o 3 y quiere el número de ocurrencias para cada elemento:

>>> from collections import Counter
>>> z = ['blue', 'red', 'blue', 'yellow', 'blue', 'red']
>>> Counter(z)
Counter({'blue': 3, 'red': 2, 'yellow': 1})

1359
2018-04-29 07:44



Contando las ocurrencias de un artículo en una lista

Para contar las ocurrencias de un solo elemento de lista, puede usar count()

>>> l = ["a","b","b"]
>>> l.count("a")
1
>>> l.count("b")
2

Contando las ocurrencias de todas los elementos en una lista también se conocen como "contar" una lista, o crear un contador de conteo.

Contando todos los artículos con conteo ()

Para contar las ocurrencias de elementos en l uno puede simplemente usar una lista de comprensión y count() método

[[x,l.count(x)] for x in set(l)]

(o similarmente con un diccionario dict((x,l.count(x)) for x in set(l)))

Ejemplo:

>>> l = ["a","b","b"]
>>> [[x,l.count(x)] for x in set(l)]
[['a', 1], ['b', 2]]
>>> dict((x,l.count(x)) for x in set(l))
{'a': 1, 'b': 2}

Contando todos los artículos con Counter ()

Alternativamente, está el más rápido Counter clase de la collections biblioteca

Counter(l)

Ejemplo:

>>> l = ["a","b","b"]
>>> from collections import Counter
>>> Counter(l)
Counter({'b': 2, 'a': 1})

¿Cuánto más rápido es el contador?

Comprobé cuánto más rápido Counter es para contar listas. Probé ambos métodos con unos pocos valores de n y parece que Counter es más rápido por un factor constante de aproximadamente 2.

Aquí está el script que utilicé:

from __future__ import print_function
import timeit

t1=timeit.Timer('Counter(l)', \
                'import random;import string;from collections import Counter;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]'
                )

t2=timeit.Timer('[[x,l.count(x)] for x in set(l)]',
                'import random;import string;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]'
                )

print("Counter(): ", t1.repeat(repeat=3,number=10000))
print("count():   ", t2.repeat(repeat=3,number=10000)

Y el resultado:

Counter():  [0.46062711701961234, 0.4022796869976446, 0.3974247490405105]
count():    [7.779430688009597, 7.962715800967999, 8.420845870045014]

184
2018-05-28 10:58



Otra forma de obtener el número de apariciones de cada elemento, en un diccionario:

dict((i, a.count(i)) for i in a)

56
2017-10-20 22:38



list.count(x) devuelve la cantidad de veces x aparece en una lista

ver: http://docs.python.org/tutorial/datastructures.html#more-on-lists


40
2018-04-08 13:34



Si quieres contar todos los valores a la vez puedes hacerlo muy rápido usando matrices numpy y bincount como sigue

import numpy as np
a = np.array([1, 2, 3, 4, 1, 4, 1])
np.bincount(a)

lo que da

>>> array([0, 3, 1, 1, 2])

27
2017-11-19 10:53



Dado un elemento, ¿cómo puedo contar sus ocurrencias en una lista en Python?

Aquí hay una lista de ejemplos:

>>> l = list('aaaaabbbbcccdde')
>>> l
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'e']

list.count

Está el list.count método

>>> l.count('b')
4

Esto funciona bien para cualquier lista. Las tuplas también tienen este método:

>>> t = tuple('aabbbffffff')
>>> t
('a', 'a', 'b', 'b', 'b', 'f', 'f', 'f', 'f', 'f', 'f')
>>> t.count('f')
6

collections.Counter

Y luego hay colecciones. Contador. Puede volcar cualquier iterable en un contador, no solo en una lista, y el contador conservará una estructura de datos de los recuentos de los elementos.

Uso:

>>> from collections import Counter
>>> c = Counter(l)
>>> c['b']
4

Los contadores se basan en diccionarios de Python, sus claves son los elementos, por lo que las claves deben ser aptas para el hash. Básicamente son como conjuntos que permiten elementos redundantes en ellos.

Uso adicional de collections.Counter

Puedes sumar o restar iterables de tu contador:

>>> c.update(list('bbb'))
>>> c['b']
7
>>> c.subtract(list('bbb'))
>>> c['b']
4

Y también puedes hacer operaciones de conjuntos múltiples con el contador:

>>> c2 = Counter(list('aabbxyz'))
>>> c - c2                   # set difference
Counter({'a': 3, 'c': 3, 'b': 2, 'd': 2, 'e': 1})
>>> c + c2                   # addition of all elements
Counter({'a': 7, 'b': 6, 'c': 3, 'd': 2, 'e': 1, 'y': 1, 'x': 1, 'z': 1})
>>> c | c2                   # set union
Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1, 'y': 1, 'x': 1, 'z': 1})
>>> c & c2                   # set intersection
Counter({'a': 2, 'b': 2})

¿Por qué no pandas?

Otra respuesta sugiere:

¿Por qué no usar pandas?

Pandas es una biblioteca común, pero no está en la biblioteca estándar. Agregarlo como una dependencia no es trivial.

Existen soluciones integradas para este caso de uso en el objeto de la lista, así como en la biblioteca estándar.

Si su proyecto aún no requiere pandas, sería una tontería hacerlo solo un requisito para esta funcionalidad.


23
2018-04-13 12:50