2009-01-09 7 views

Répondre

14

Utilisez defaultdict

from collections import defaultdict 
kvmap= defaultdict(int) 
for k in a_list: 
    kvmap[k] += 1 
+0

Oh mec, je hadn Excellente! – Dana

+0

La première fois que j'ai rencontré defaultdict, c'était dans l'article correcteur d'orthographe de Peter Norvig: en quelques lignes, il récupère un fichier de mots et le convertit en un dictionnaire de clé = mot value = count Très cool http://www.norvig.com/spell-correct.html – hughdbrown

9

un seul élément:

a_list.count(k) 

Tous les éléments:

counts = dict((k, a_list.count(k)) for k in set(a_list)) 
+0

Est-ce que ce n'est pas assez inefficace? Vous convertissez la liste en un ensemble, en itérant sur elle et en appelant un nombre (probablement O (N) pour chaque élément de l'ensemble.) – Dana

+0

Vous avez raison, il est plus que probable O (n^2), bien que je pense son amusement dans ce genre de façon python –

+0

une expression génératrice au lieu de la compréhension de la liste est suffisante.aussi, en utilisant un tuple au lieu de la liste intérieure semble plus agréable, je pense que – hop

7

Je ne sais pas, il semble fondamentalement bien pour moi. Votre code est simple et facile à lire, ce qui est une partie importante de ce que je considère comme pythonique.

Vous pouvez le couper un peu comme ceci:

for k in a_list: 
    kvMap[k] = 1 + kvMap.get(k,0) 
+0

c'est ce que je vais poster! – hasen

3

Une autre solution exploite setdefault():

for k in a_list: 
    kvMap[k] = kvMap.setdefault(k, 0) + 1 
1

Si votre liste est triée, une alternative serait d'utiliser itertools.groupby. Ce n'est peut-être pas le moyen le plus efficace, mais c'est quand même intéressant. Il retour précis ou chiffré un dict de l'article> 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} 
+0

la compréhension de la liste externe est pas nécessaire; une expression de générateur est suffisante. – hop

+0

dict ((clé, len (liste (groupe))) pour (clé, groupe) dans itertools.groupby (l)) – nosklo

4

Cette vieille question, mais étant donné que l'ajout d'un defaultdict(int) est un usage courant, il ne faut donc pas surprenant que collections a un nom spécial pour que (depuis 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}) 
Questions connexes