una - frecuencia de palabras python
¿Cuál es la manera pitónica de contar la ocurrencia de un elemento en una lista? (6)
Esto es lo que hice. ¿hay una mejor manera en Python?
for k in a_list: if kvMap.has_key(k): kvMap[k]=kvMap[k]+1 else: kvMap[k]=1
Gracias
No sé, básicamente se ve bien para mí. Su código es simple y fácil de leer, que es una parte importante de lo que considero pitónico.
Puedes recortarlo un poco así:
for k in a_list:
kvMap[k] = 1 + kvMap.get(k,0)
Otra solución explota setdefault ():
for k in a_list:
kvMap[k] = kvMap.setdefault(k, 0) + 1
Use defaultdict
from collections import defaultdict
kvmap= defaultdict(int)
for k in a_list:
kvmap[k] += 1
Elemento individual:
a_list.count(k)
Todos los elementos:
counts = dict((k, a_list.count(k)) for k in set(a_list))
Si su lista está ordenada, una forma alternativa sería usar itertools.groupby . Esta podría no ser la manera más efectiva, pero de todos modos es interesante. Retomas un dict de item> count:
>>> import itertools
>>> l = [1,1,2,3,4,4,4,5,5,6,6,6,7]
>>> dict([(key, len([e for e in group]))
for (key, group)
in itertools.groupby(l)])
{1: 2, 2: 1, 3: 1, 4: 3, 5: 2, 6: 3, 7: 1}
Una pregunta tan vieja, pero considerando que agregar un defaultdict(int)
es un uso tan común, no debería sorprender que las collections
tengan un nombre especial para eso (desde Python 2.7)
>>> from collections import Counter
>>> Counter([1, 2, 1, 1, 3, 2, 3, 4])
Counter({1: 3, 2: 2, 3: 2, 4: 1})
>>> Counter("banana")
Counter({''a'': 3, ''n'': 2, ''b'': 1})