Dado un elemento, ¿cómo puedo contar sus ocurrencias en una lista en Python?
                1530
            
  
              
        Si solo desea el recuento de un elemento, use el countmétodo:
>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3
No use esto si desea contar varios elementos. Las llamadas counten bucle requieren un pase separado sobre la lista para cada countllamada, lo que puede ser catastrófico para el rendimiento. Si desea contar todos los elementos, o incluso solo varios, use Counter, como se explica en las otras respuestas.
mylist = [1,7,7,7,3,9,9,9,7,9,10,0] print sorted(set([i for i in mylist if mylist.count(i)>2]))Úselo
Countersi está utilizando Python 2.7 o 3.xy desea el número de ocurrencias para cada elemento:fuente
isinstance. Entonces, si está seguro de los datos con los que está trabajando, podría ser mejor escribir una función personalizada sin verificación de tipo e instancia.isinstancellamadas? Incluso con millones de cadenas, llamarCountersolo implica unaisinstancellamada, para verificar si su argumento es un mapeo. Lo más probable es que hayas juzgado mal lo que está comiendo todo tu tiempo.Counterha llevado a contar grandes iterables, en lugar de contar muchos iterables. Contar un iterativo de un millón de cadenas será más rápidoCounterque con una implementación manual. Si desea llamarupdatecon muchos iterables, puede acelerar las cosas uniéndolas en un solo iterableitertools.chain.Contando las ocurrencias de un artículo en una lista
Para contar las ocurrencias de un solo elemento de la lista, puede usar
count()Contar las ocurrencias de todos los elementos de una lista también se conoce como "contar" una lista o crear un contador de conteo.
Contando todos los artículos con count ()
Para contar las ocurrencias de los elementos en
luno, simplemente puede usar una lista de comprensión y elcount()método(o de manera similar con un diccionario
dict((x,l.count(x)) for x in set(l)))Ejemplo:
Contando todos los artículos con Counter ()
Alternativamente, está la
Counterclase más rápida de lacollectionsbiblioteca.Ejemplo:
¿Cuánto más rápido es Counter?
Verifiqué cuánto más rápido
Counteres para las listas de conteo. Probé ambos métodos con algunos valores deny parece queCounteres más rápido en un factor constante de aproximadamente 2.Aquí está el script que usé:
Y la salida:
fuente
Counteres mucho más rápido para listas más grandes. El método de comprensión de la lista es O (n ^ 2),Counterdebe ser O (n).isinstance. Entonces, si está seguro de los datos con los que está trabajando, podría ser mejor escribir una función personalizada sin verificación de tipo e instancia.Otra forma de obtener el número de ocurrencias de cada elemento, en un diccionario:
fuente
n * (number of different items)operaciones, sin contar el tiempo que lleva construir el conjunto. Usarcollections.Counteres realmente mucho mejor.i, porque intentará ingresar múltiples claves del mismo valor en un diccionario.dict((i, a.count(i)) for i in a)list.count(x)devuelve el número de veces quexaparece en una listaver: http://docs.python.org/tutorial/datastructures.html#more-on-lists
fuente
Aquí hay una lista de ejemplos:
list.countAhí está el
list.countmétodoEsto funciona bien para cualquier lista. Las tuplas también tienen este método:
collections.CounterY luego están las colecciones. Contador. Puede volcar cualquier iterable en un Contador, no solo una lista, y el Contador retendrá una estructura de datos de los recuentos de los elementos.
Uso:
Los contadores se basan en diccionarios de Python, sus claves son los elementos, por lo que las claves deben ser hashaable. Básicamente son como conjuntos que permiten elementos redundantes en ellos.
Uso adicional de
collections.CounterPuede sumar o restar con iterables de su contador:
Y también puede realizar operaciones de conjuntos múltiples con el contador:
¿Por qué no pandas?
Otra respuesta sugiere:
Pandas es una biblioteca común, pero no está en la biblioteca estándar. Agregarlo como un requisito no es trivial.
Hay soluciones integradas para este caso de uso en el objeto de lista en sí, así como en la biblioteca estándar.
Si su proyecto aún no requiere pandas, sería una tontería exigirlo solo para esta funcionalidad.
fuente
Comparé todas las soluciones sugeridas (y algunas nuevas) con perfplot (un pequeño proyecto mío).
Contando un artículo
Para matrices lo suficientemente grandes, resulta que
es un poco más rápido que las otras soluciones.
Contando todos los artículos
Como se estableció anteriormente ,
es lo que quieres
Código para reproducir las tramas:
2)
fuente
Si desea contar todos los valores a la vez , puede hacerlo muy rápido utilizando matrices numpy y de la
bincountsiguiente maneralo que da
fuente
Si puede usar
pandas, entoncesvalue_countsestá allí para rescatarlo.También clasifica automáticamente el resultado según la frecuencia.
Si desea que el resultado esté en una lista de la lista, haga lo siguiente
fuente
¿Por qué no usar pandas?
Salida:
Si está buscando un conteo de un elemento en particular, diga a , intente:
Salida:
fuente
Tuve este problema hoy y lancé mi propia solución antes de pensar en comprobar SO. Esta:
es muy, muy lento para listas grandes. Mi solución
en realidad es un poco más rápido que la solución Counter, al menos para Python 2.7.
fuente
fuente
A continuación se presentan las tres soluciones:
Lo más rápido es usar un bucle for y almacenarlo en un Dict.
Resultado
fuente
Recuento de todos los elementos con
itertools.groupby()Otra posibilidad para obtener el recuento de todos los elementos de la lista podría ser mediante
itertools.groupby().Con recuentos "duplicados"
Devoluciones
Observe cómo combinó los primeros tres
acomo el primer grupo, mientras que otros gruposaestán presentes más abajo en la lista. Esto sucede porque la lista de entradaLno se ordenó. Esto puede ser un beneficio a veces si los grupos deberían estar separados.Con recuentos únicos
Si se desean recuentos de grupos únicos, simplemente ordene la lista de entrada:
Devoluciones
Nota: Para crear recuentos únicos, muchas de las otras respuestas proporcionan un código más fácil y más legible en comparación con la
groupbysolución. Pero se muestra aquí para dibujar un paralelo al ejemplo de conteo duplicado.fuente
Se sugirió usar el bincount de numpy , sin embargo, solo funciona para matrices 1d con enteros no negativos . Además, la matriz resultante puede ser confusa (contiene las ocurrencias de los enteros de mínimo a máximo de la lista original, y establece en 0 los enteros faltantes).
Una mejor manera de hacerlo con numpy es usar la función única con el atributo
return_countsestablecido en True. Devuelve una tupla con una matriz de valores únicos y una matriz de las ocurrencias de cada valor único.y luego podemos emparejarlos como
También funciona con otros tipos de datos y "listas 2d", p. Ej.
fuente
Para contar la cantidad de elementos diversos que tienen un tipo común:
da
3no 6fuente
Aunque es una pregunta muy antigua, pero como no encontré una sola línea, hice una.
fuente
También puede usar el
countOfmétodo de un módulo incorporadooperator.fuente
countOfse implementa? ¿Cómo se compara con lo más obviolist.count(que se beneficia de la implementación de C)? ¿Hay alguna ventaja?Puede no ser el más eficiente, requiere un pase adicional para eliminar duplicados.
Implementación funcional:
devoluciones :
o volver como
dict:devoluciones :
fuente
Esto devolverá la cantidad de ocurrencias de your_value
fuente
Yo usaría
filter(), tome el ejemplo de Lukasz:fuente
si desea una serie de ocurrencias para el elemento en particular:
fuente
fuente
esto contará recursivamente o buscará el elemento en la lista incluso si está en la lista de listas
fuente