Python 2.7 compter le nombre d'articles de dictionnaires avec une valeur donnée

première question ici, donc je vais aller droit au but:

utilisant python 2.7

j'ai un dictionnaire d'articles, les clés sont un X,Y coordonnée représentée comme un tuple: (x,y) et toutes les valeurs sont des valeurs booléennes.

j'essaie de trouver une méthode rapide et propre pour obtenir un compte de combien d'articles ont une valeur donnée. Je N'ai pas besoin de savoir quelles clés ont la valeur donnée, juste combien.

il y a un poste similaire ici: Combien d'objets dans un dictionnaire partagent la même valeur en Python , cependant je n'ai pas besoin d'un dictionnaire retourné, juste un entier.

ma première pensée est d'itérer sur les éléments et de tester chacun tout en gardant un compte de chaque valeur réelle ou quelque chose. Je me demande juste, puisque je suis encore nouveau en python et que je ne connais pas toutes les bibliothèques, s'il y a une meilleure façon/plus rapide/plus simple de le faire.

merci à l'avance.

22
demandé sur Community 2012-11-20 01:14:46

2 réponses

cette première partie est principalement pour le plaisir -- Je ne l'utiliserais probablement pas dans mon code.

sum(d.values())

obtiendra le nombre de valeurs True . (Bien sûr, vous pouvez obtenir le nombre de False valeurs len(d) - sum(d.values()) ).


un peu plus généralement, vous pouvez faire quelque chose comme:

sum(1 for x in d.values() if some_condition(x))

dans ce cas, if x fonctionne très bien à la place de if some_condition(x) et est ce que la plupart les gens utiliseraient dans le code du monde réel)

DES TROIS SOLUTIONS QUE J'AI POSTÉES ICI, LA PLUS IDIOMATIQUE ET EST CELLE QUE JE RECOMMANDE


enfin, je suppose que cela pourrait être écrit un peu plus habilement:

sum( x == chosen_value for x in d.values() )

c'est dans la même veine que ma première solution (fun) puisqu'elle s'appuie sur le fait que True + True == 2 . Intelligent n'est pas toujours le meilleur. Je je pense que la plupart des gens considéreraient cette version comme un peu plus obscure que celle ci-dessus (et donc pire).

32
répondu mgilson 2012-11-19 22:42:28

si vous voulez une structure de données à laquelle vous pouvez accéder rapidement pour vérifier les comptes, vous pouvez essayer d'utiliser un compteur (comme @mgilson le souligne, Cela dépend des valeurs elles-mêmes étant hachables):

>>> from collections import Counter
>>> d = {(1, 2): 2, (3, 1): 2, (4, 4): 1, (5, 6): 4}
>>> Counter(d.values())
Counter({2: 2, 1: 1, 4: 1})

vous pourriez alors brancher une valeur et obtenir le nombre de fois où il est apparu:

>>> c = Counter(d.values())
>>> c[2]
2
>>> c[4]
1
9
répondu RocketDonkey 2012-11-19 22:17:35