2010-11-09 6 views
7

Eventuali duplicati:
How to count the frequency of the elements in a list?Contare il numero di elementi di pari valore in Python

desidero contare il numero di elementi di pari valore in una lista e restituire un dict come Ad esempio:

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

Suppongo che sia una specie di istogramma?

+0

Perché il downvote? – Theodor

+0

Non ho fatto un downvote, ma probabilmente è perché potresti aver trovato la risposta a questo con alcuni secondi di ricerca poiché è probabilmente una delle domande più complicate. – aaronasterling

+0

Il "duplicato" menzionato non risponde a questa domanda, dal momento che Theodor sta chiedendo un ditt come risultato, che è esattamente quello che stavo cercando ..http: //stackoverflow.com/questions/2161752/how-to-count -la-frequenza-degli-elementi-in-a-lista dà un risultato diverso. - Upvoted :-) –

risposta

8

Questo è un buon modo, se non si dispone di collections.Counter disponibili

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

Grazie, ha funzionato bene. Probabilmente dovrei aggiornare Python come menzionato sopra, ma il tempo è sempre breve;) – Theodor

7

Utilizzare un Counter: conteggio

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

Come notato da Mark Byers, Counter è disponibile solo in Python 2.7+. Ma penso che sia il momento di aggiornare il mio 2.6.6 in ogni caso;) – Theodor

2

utilizzare per ottenere il conteggio di un elemento della lista e impostare per gli elementi unici:

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

Questo è piuttosto inefficiente, 'l.count (x)' analizza l'intero elenco ogni volta –

0

Prima che ci fosse contatore, c'era 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} 

(Per groupby a lavorare per questo scopo, la lista di input a deve essere in modo ordinato. In questo caso, a è già ordinato.)