2009-10-22 13 views
9

Mam słownika obiekt Pythona, który zawiera wartość logiczną dla każdego klucza, np .:Liczenie wartości logiczne w słowniku

d = {'client1': True, 'client2': False} 

Jaki jest najprostszy i najbardziej zwięzły sposób policzyć liczbę prawdziwych wartości w słowniku?

Odpowiedz

19

Dla jasności:

num_true = sum(1 for condition in d.values() if condition) 

Dla zwięzłości (to działa, ponieważ prawda jest podklasą int o wartości 1):

num_true = sum(d.values()) 
+2

+1 dla wyjaśnienia. –

2
sum(d.values()) 
+0

Proste i ogólne, trzeba tylko wiedzieć, że booleany są również liczbami całkowitymi w Pythonie, a dokładnie 0 i 1 (co nie jest zaskakujące). – u0b34a0f6ae

+0

do tego służą następujące dokumenty: http://docs.python.org/library/stdtypes.html#boolean-values ​​ – SilentGhost

1

W Pythonie 2.*, suma (d. itervalues ​​()) jest nieco mniej zwięzły niż proponowane przez wielu (4 kolejne znaki ;-)), ale unika niepotrzebnego materializowania listy wartości, a więc oszczędza pamięć (i prawdopodobnie czas), gdy duży słownik do radzenia sobie.

Jak niektórzy zwracają uwagę, to działa prawidłowo, ponieważ bools są ints (podklasa konkretnie):

>>> False==0 
True 
>>> False+True 
1 

zatem, nie ma potrzeby circumlocutory if klauzul.

2
a.values().count(True) 
+1

jasne, ale nie tak jasne, jak użycie 'sum()' IMO. Przestanie działać, gdy wartość 'dict.values' w Pythonie 3 zwróci widok interwałowy, a nie listę. – u0b34a0f6ae

+1

jak to nie jest tak jasne, jak przy użyciu "sumy"? czyta "zlicz liczbę elementów w wartościach(), których wartość jest prawdziwa"; jest bezpośrednim tłumaczeniem problemu, podczas gdy sum() wprowadza jeden poziom pojęciowego pośrednictwa. –

+0

faktycznie jest to bardziej angielski niż przy użyciu wartości true jako liczby. – tarrasch

Powiązane problemy