2013-09-22 12 views

risposta

7

Come su

sum(1 for d in my_list if d.get('id') == the_value_you_are_interested_in) 

>>> my_list = [{ 'id':1, 'val':123 }, {'id':2, 'val':456 }, {'id':2, 'val':789 }] 
>>> sum(1 for d in my_list if d.get('id') == 1) 
1 
>>> sum(1 for d in my_list if d.get('id') == 2) 
2 
>>> sum(1 for d in my_list if d.get('id') == 20) 
0 

Nota l'uso del generatore di piuttosto che una lista di 1s. Questa è una tecnica abbastanza consolidata e probabilmente appare in diverse domande StackOverflow.

Non vedo alcun modo di sfruttare list.count(x) poiché questo metodo conta il numero di occorrenze di x, che nel tuo caso sarebbero dizionari completi. Python ha un metodo filter, ma le preferenze sono molto preferite.

+0

Non capisco il tuo messaggio in ultima riga in risposta - pitone studente. –

+2

Se scrivo 'sum ([1 per x in a])' e 'a' è una lista enorme, quindi la comprensione delle liste genera teoricamente una lista enorme di 1, POI li somma tutti. Ma se scrivo 'sum (1 per x in a)' allora gli 1 vengono sommati mentre 'a' viene iterato su, senza che la struttura grande venga realizzata. –

+0

Compralo subito! informazioni molto utili per me. Grazie mille. –

6

Mi piace la risposta di @ Ray. Un altro bel trucco è usare collections.Counter.

from collections import Counter 

c = Counter(item for dct in my_list for item in dct.items()) 
c 
=> Counter({('id', 2): 2, ('val', 123): 1, ('id', 1): 1, ('val', 456): 1, ('val', 789): 1}) 

c[('id', 2)] 
=> 2 
c[('id', 1)] 
=> 1 
c[('id', 20)] 
=> 0 

Questa soluzione è particolarmente utile se è necessario contare più chiavi/valori.

Se vi interessa soltanto un determinato tasto, si può fare:

k = 'id' 
id_counter = Counter(dct.get(k) for dct in my_list) 
id_counter 
=> Counter({2: 2, 1: 1}) 
id_counter[2] 
=> 2 
Problemi correlati