2013-09-22 13 views
5

Mam listę słowników (w skrócie).Jak zliczyć wystąpienia elementu na liście słowników?

my_list = [{ 'id':1, 'val':123 }, {'id':2, 'val':456 }, {'id':2, 'val':789 }] 

Jak mogę zliczyć wystąpienia słowników o określonej wartości dla określonego klucza (w tym przypadku „id”)? Czy istnieje sposób, aby wykorzystać licznik (my_list.count('id' = 1)?!?)

Odpowiedz

7

Jak o

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 

Uwaga użycie generatora raczej niż listy 1s. Jest to ustalona technika i prawdopodobnie pojawia się na kilku pytaniach StackOverflow.

Nie widzę żadnego sposobu na wykorzystanie list.count(x), ponieważ ta metoda zlicza liczbę wystąpień x, które w twoim przypadku byłyby kompletnymi słownikami. Python ma metodę filter, ale zrozumienie jest bardzo preferowane.

+0

Nie rozumiem swój post w ostatniej linii w odpowiedzi - pyton ucznia. –

+2

Jeśli napiszę 'sumę ([1 na x w a])' a 'a' jest ogromną listą, wtedy lista rozumienia teoretycznie generuje ogromną listę 1, TO sumuje je wszystkie. Ale jeśli napiszę 'sumę (1 dla x w a)', to 1s są sumowane, gdy 'a' jest iterowane, bez realizacji dużej struktury. –

+0

Gotowy teraz! bardzo przydatne informacje dla mnie. Dziękuję bardzo. –

6

Podoba mi się odpowiedź @ Ray'a. Kolejną fajną sztuczką jest użycie 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 

To rozwiązanie jest szczególnie dobre, jeśli trzeba liczyć wiele kluczy/wartości.

Jeśli tylko dbają o danym kluczu, można zrobić:

k = 'id' 
id_counter = Counter(dct.get(k) for dct in my_list) 
id_counter 
=> Counter({2: 2, 1: 1}) 
id_counter[2] 
=> 2 
Powiązane problemy