first question here, so i will get right to it:
using python 2.7
I have a dictionary of items, the keys are an x,y coordinate represented as a tuple: (x,y) and all the values are Boolean values.
I am trying to figure out a quick and clean method of getting a count of how many items have a given value. I do NOT need to know which keys have the given value, just how many.
there is a similar post here: How many items in a dictionary share the same value in Python, however I do not need a dictionary returned, just an integer.
My first thought is to iterate over the items and test each one while keeping a count of each True value or something. I am just wondering, since I am still new to python and don't know all the libraries, if there is a better/faster/simpler way to do this.
thanks in advance.
Python dictionary method len() gives the total length of the dictionary. This would be equal to the number of items in the dictionary.
Use len() to count dictionary items The len() method returns the total length of a dictionary, or more precisely, the total number of items in the dictionary.
To find the number of elements stored in a dictionary we can use the len() function. To find the size of a dictionary in bytes we can use the getsizeof() function of the sys module. To count the elements of a nested dictionary, we can use a recursive function.
It is pretty easy to get the sum of values of a python dictionary. You can first get the values in a list using the dict. values(). Then you can call the sum method to get the sum of these values.
This first part is mostly for fun -- I probably wouldn't use it in my code.
sum(d.values())
will get the number of True
values. (Of course, you can get the number of False
values by len(d) - sum(d.values())
).
Slightly more generally, you can do something like:
sum(1 for x in d.values() if some_condition(x))
In this case, if x
works just fine in place of if some_condition(x)
and is what most people would use in real-world code)
OF THE THREE SOLUTIONS I HAVE POSTED HERE, THE ABOVE IS THE MOST IDIOMATIC AND IS THE ONE I WOULD RECOMMEND
Finally, I suppose this could be written a little more cleverly:
sum( x == chosen_value for x in d.values() )
This is in the same vein as my first (fun) solution as it relies on the fact that True + True == 2
. Clever isn't always better. I think most people would consider this version to be a little more obscure than the one above (and therefore worse).
If you want a data structure that you can quickly access to check the counts, you could try using a Counter (as @mgilson points out, this relies on the values themselves being hashable):
>>> 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})
You could then plug in a value and get the number of times it appeared:
>>> c = Counter(d.values()) >>> c[2] 2 >>> c[4] 1
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With