2009-10-22 7 views
9

j'ai un objet dictionnaire python qui contient une valeur booléenne pour chaque touche, par exemple .:Compter booléens dans le dictionnaire

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

Quelle est la façon la plus simple et la plus concise de compter le nombre de vraies valeurs dans le dictionnaire?

Répondre

19

Pour plus de clarté:

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

Par souci de concision (cela fonctionne parce que la vraie est une sous-classe de int avec une valeur 1):

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

+1 pour l'explication. –

2
sum(d.values()) 
+0

Simple et général, il suffit de savoir que les booléens sont aussi des entiers en Python, et spécifiquement 0 et 1 (ce qui n'est pas surprenant). – u0b34a0f6ae

+0

c'est ce que docs sont pour: http://docs.python.org/library/stdtypes.html#boolean-values ​​ – SilentGhost

1

En Python 2.*, somme (d. itervalues ​​()) est légèrement moins concis que le sum(d.values()) que beaucoup proposent (4 autres caractères ;-), mais évite de matérialiser inutilement la liste de valeurs et économise ainsi de la mémoire (et probablement du temps) quand vous avez un grand dictionnaire à traiter.

Comme certains l'ont souligné, cela fonctionne très bien, parce que bools sont ints (une sous-classe, en particulier):

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

donc pas besoin de clauses circonlocutions if.

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

clair, mais pas aussi clair que l'utilisation 'somme()' l'OMI. Arrêtera de fonctionner quand 'dict.values' de Python 3 retournera une vue interable, pas une liste. – u0b34a0f6ae

+1

Comment n'est-il pas aussi clair que d'utiliser "sum"? il lit "compter le nombre d'éléments dans les valeurs() dont la valeur est Vrai"; c'est une traduction directe du problème alors que sum() introduit un niveau d'indirection conceptuelle. –

+0

en fait c'est plus anglais que d'utiliser vrai comme un nombre. – tarrasch

Questions connexes