2010-08-16 17 views
96

Soy nuevo a Python y tengo una pregunta simple, decir que tengo una lista de elementos:Python: El uso de un diccionario para contar los elementos de una lista

['apple','red','apple','red','red','pear'] 

¿Cuál es la manera más simple para agregar la enumere los elementos en un diccionario y cuente cuántas veces aparece el elemento en la lista.

Así que para la lista anterior me gustaría que la salida sea:

{'apple': 2, 'red': 3, 'pear': 1} 
+1

se puede conseguir la inspiración aquí: http : //stackoverflow.com/questions/2870466/python-histogram-one-liner – mykhal

+0

http://stackoverflow.com/questions/13242103/how-to-compute-letter-frequency-in-a-string-using-pythons -built-in-map-and-reduc –

+0

¿Alguien notó el orden de salida? ¿Eso es irrelevante? –

Respuesta

46
>>> L = ['apple','red','apple','red','red','pear'] 
>>> from collections import defaultdict 
>>> d = defaultdict(int) 
>>> for i in L: 
... d[i] += 1 
>>> d 
defaultdict(<type 'int'>, {'pear': 1, 'apple': 2, 'red': 3}) 
+2

Probablemente el método más rápido y menos abarrotado. –

3
L = ['apple','red','apple','red','red','pear'] 
d = {} 
[d.__setitem__(item,1+d.get(item,0)) for item in L] 
print d 

Da {'pear': 1, 'apple': 2, 'red': 3}

170

en 2.7 y 3.1 no es especial Counter dict para este propósito.

>>> from collections import Counter 
>>> Counter(['apple','red','apple','red','red','pear']) 
Counter({'red': 3, 'apple': 2, 'pear': 1}) 
+11

Yuck; suficiente hinchamiento de propósito limitado en la biblioteca de Python, ya. –

+2

La línea oficial, o mejor dicho, parado, es que Guido tiene una máquina del tiempo ... –

+8

@Glenn Maynard Counter es solo una implementación de ** multiset ** que no es una estructura de datos poco común IMO. De hecho, C++ tiene una implementación en el STL llamada 'std :: multiset' (también' std :: tr1 :: unordered_multiset') por lo que Guido no está solo en su opinión sobre su importancia. – awesomo

11

Siempre pensé que para una tarea tan trivial, no me gustaría importar nada. Pero puedo estar equivocado, dependiendo de las colecciones. El encuentro es más rápido o no.

items = "Whats the simpliest way to add the list items to a dictionary " 

stats = {} 
for i in items: 
    if i in stats: 
     stats[i] += 1 
    else: 
     stats[i] = 1 

# bonus 
for i in sorted(stats, key=stats.get): 
    print("%d×'%s'" % (stats[i], i)) 

creo que esto puede ser preferible al uso de count(), ya que sólo va a ir sobre el iterable una vez, mientras que contar puede buscar en toda la cosa en cada iteración. Usé este método para analizar muchos megabytes de datos estadísticos y siempre fue razonablemente rápido.

+1

Su respuesta merece más crédito por su simplicidad. Estuve luchando por esto por un tiempo, quedándome desconcertado con la tontería de algunos de los otros usuarios sugiriendo importar nuevas bibliotecas, etc. – ntk4

92

me gustan:

counts = dict() 
for i in items: 
    counts[i] = counts.get(i, 0) + 1 

.get le permite especificar un valor por defecto si no existe la clave.

+6

Para los nuevos en python. Esta respuesta es mejor en términos de complejidad de tiempo. – curiousMonkey

+0

Esta respuesta funciona incluso en una lista de números de punto flotante, donde algunos de los números pueden ser '0' – SherylHohman

6

¿Qué tal esto:

src = [ 'one', 'two', 'three', 'two', 'three', 'three' ] 
result_dict = dict([ (i, src.count(i)) for i in set(src) ]) 

Esto se traduce en

{ 'uno': 1, 'tres': 3, 'dos': 2}

+7

Tenga en cuenta que esto es 'O (n^2)' debido a las llamadas 'n' a' src.count() '. – dimo414

23

simplemente usar la lista de recuento de la propiedad \

i = ['apple','red','apple','red','red','pear'] 
d = {x:i.count(x) for x in i} 
print d 

de salida: { 'pera': 1, 'manzana': 2, 'rojo': 3}

+2

Mientras funciona, parece que sería ineficiente. – Ouroborus

+0

puede elaborar? –

+0

Está aplicando 'count' contra la matriz tantas veces como s hay elementos de matriz. Su solución es 'O (n^2)' donde la mejor solución trivial es 'O (n)'. Consulte los comentarios en [respuesta de riviera] (https://stackoverflow.com/a/9604768/367865) en comparación con los comentarios en [respuesta de mmdreg] (https://stackoverflow.com/a/6582852/367865). – Ouroborus

Cuestiones relacionadas