2010-03-08 28 views

Respuesta

34
>>> x=['a','a','b','c','c','c'] 
>>> map(x.count,x) 
[2, 2, 1, 3, 3, 3] 
>>> dict(zip(x,map(x.count,x))) 
{'a': 2, 'c': 3, 'b': 1} 
>>> 
+0

+1, hermosa! :) – Mizipzor

+2

El resultado es bonito, pero tiene un comportamiento de tiempo de ejecución O (n^2) potencial. – Juergen

+2

Pero nunca dijo nada sobre el rendimiento ... esto resuelve el problema, si es demasiado ineficiente ese es un problema diferente para resolver. – chills42

2

Para el primero:

l = [ 'a', 'a', 'b', 'c',' c', 'c']

mapa (l.count, l)

4
a = ['a','a','b','c','c','c'] 
b = [a.count(x) for x in a] 
c = dict(zip(a, b)) 

He incluido la respuesta de Wim. Gran idea

+0

'c = dict (zip (a, b))' debería hacerlo para calcular 'c' – Wim

3

segundo podría ser sólo

dict(zip(['a','a','b','c','c','c'], [2, 2, 1, 3, 3, 3])) 
+0

+1 ¡genial! He actualizado mi respuesta – luc

11

Esta codificación debe dar el resultado:

from collections import defaultdict 

myDict = defaultdict(int) 

for x in mylist: 
    myDict[x] += 1 

Por supuesto, si desea que la lista entre medio consecuencia, acaba de obtener los valores de el dict (mydict.values ​​()).

+0

+1 por ser O (N) – sholsapp

1
d=defaultdict(int) 
for i in list_to_be_counted: d[i]+=1 
l = [d[i] for i in list_to_be_counted] 
6

Utilice un set para contar solamente cada artículo una vez, utilizar el método de la lista count contarlos, almacenarlos en una dict con el artículo como clave y la ocurrencia es el valor.

l=["a","a","b","c","c","c"] 
d={} 

for i in set(l): 
    d[i] = l.count(i) 

print d 

Salida:

{'a': 2, 'c': 3, 'b': 1} 
+0

para mí este es el más simple de entender/implementar. ¿Sabes si es más lento que usar el contador de colecciones? – zach

+0

Para ejemplos tan triviales, implemétalos y cronometralos. No confíes en mis conjeturas. O más bien, no te importa la velocidad en absoluto; estás usando Python por simplicidad, no por rendimiento. – Mizipzor

5

En Python o ≥2.7 ≥3.1, tenemos un sistema incorporado en la estructura de datos collections.Counter para anotar una lista

>>> l = ['a','a','b','c','c','c'] 
>>> Counter(l) 
Counter({'c': 3, 'a': 2, 'b': 1}) 

Es fácil de construir [2, 2, 1, 3, 3, 3] después.

>>> c = _ 
>>> [c[i] for i in l] # or map(c.__getitem__, l) 
[2, 2, 1, 3, 3, 3] 
Cuestiones relacionadas