2010-11-09 32 views
7

Possible en double:
How to count the frequency of the elements in a list?Compter le nombre d'éléments de même valeur en Python

Je souhaite compter le nombre d'éléments de même valeur dans une liste et retourner un dict comme tel:

> 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} 

Je suppose que c'est un peu un histogramme?

+0

Pourquoi le downvote? – Theodor

+0

Je n'ai pas fait de downvote mais c'est probablement parce que vous auriez pu trouver la réponse à cela avec quelques secondes de recherche car c'est probablement parmi la question la plus dupée. – aaronasterling

+0

Le "duplicata" mentionné ne répond pas à cette question, puisque Theodor demande un dict comme le résultat, qui est exactement ce que je cherchais juste.http: //stackoverflow.com/questions/2161752/how-to-count -la-fréquence-des-éléments-dans-une-liste donne une sortie différente. - Upvoted :-) –

Répondre

8

C'est une bonne façon si vous n'avez pas collections.Counter disponible

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

Merci, cela a bien fonctionné. Je devrais probablement mettre à jour Python comme mentionné ci-dessus, mais le temps est toujours court;) – Theodor

7

Utilisez 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

Comme Mark Byers l'a noté, Counter n'est disponible qu'en Python 2.7+. Mais je pense qu'il est temps de mettre à jour mon 2.6.6 de toute façon;) – Theodor

2

nombre d'utiliser pour obtenir le compte d'un élément dans la liste et définir des éléments uniques:

>>> 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

Ceci est assez inefficace, 'l.count (x)' scanne la liste entière à chaque fois –

0

Avant il y avait Counter, il y avait 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} 

(Pour groupby à travailler à cet effet, la liste d'entrée a doit être dans l'ordre. Dans ce cas, a est déjà trié.)