2010-11-09 24 views
7

Duplicar posibles:
How to count the frequency of the elements in a list?Contar el número de elementos del mismo valor en Python

deseo de contar el número de elementos del mismo valor en una lista y devolver un diccionario como tales:

> a = map(int,[x**0.5 for x in range(20)]) 
> a 
> [0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4] 

> number_of_elements_by_value(a) 
> {0:1, 1:3, 2:5, 3:7, 4:4} 

Supongo que es un tipo de histograma?

+0

¿Por qué el voto a favor? – Theodor

+0

No he votado negativamente, pero es probable que haya podido encontrar la respuesta a esto con unos pocos segundos de búsqueda, ya que probablemente sea una de las preguntas más engañadas. – aaronasterling

+0

El mencionado "duplicado" no responde a esta pregunta, ya que Theodor está pidiendo un dict como resultado, que es exactamente lo que estaba buscando.http: //stackoverflow.com/questions/2161752/how-to-count -la-frecuencia-de-los-elementos-en-una-lista da una salida diferente. - Upvoted :-) –

Respuesta

8

Ésta es una buena manera si usted no tiene collections.Counter disponibles

from collections import defaultdict 
d = defaultdict(int) 
a = map(int, [x**0.5 for x in range(20)]) 
for i in a: 
    d[i] += 1 

print d 
+0

Gracias, funcionó muy bien. Probablemente debería actualizar Python como se menciona arriba, pero el tiempo siempre es corto;) – Theodor

7

Utilice un Counter:

>>> from collections import Counter 

>>> a = map(int,[x**0.5 for x in range(20)]) 
>>> a 
[0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4] 
>>> c = Counter(a) 
>>> c[2] 
5 
+0

Al igual que Mark Byers señaló, Counter solo está disponible en Python 2.7+. Pero creo que es hora de actualizar mi 2.6.6 de todos modos;) – Theodor

2

Uso recuento para obtener el recuento de un elemento en la lista y el sistema para elementos singulares:

>>> l = [0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4] 
>>> k = [(x, l.count(x)) for x in set(l)] 
>>> k 
[(0, 1), (1, 3), (2, 5), (3, 7), (4, 4)] 
>>> 
>>> 
>>> dict(k) 
{0: 1, 1: 3, 2: 5, 3: 7, 4: 4} 
>>> 
+0

Esto es bastante ineficiente, 'l.count (x)' escanea toda la lista cada vez –

0

Antes de que hubiera Contador, hubo GroupBy:

>>> a = map(int,[x**0.5 for x in range(20)]) 
>>> from itertools import groupby 
>>> a_hist= dict((g[0],len(list(g[1]))) for g in groupby(a)) 
>>> a_hist 
{0: 1, 1: 3, 2: 5, 3: 7, 4: 4} 

(Para GroupBy para trabajar con este fin, la lista de entrada a debe estar en el orden establecido. En este caso, a ya está clasificado.)

Cuestiones relacionadas