## Conditional counting in Python

Question!

not sure this was asked before, but I couldn't find an obvious answer. I'm trying to count the number of elements in a list that are equal to a certain value. The problem is that these elements are not of a built-in type. So if I have

``````class A:
def __init__(self, a, b):
self.a = a
self.b = b

stuff = []
for i in range(1,10):
stuff.append(A(i/2, i%2))
``````

Now I would like a count of the list elements whose field b = 1. I came up with two solutions:

``````print [e.b for e in stuff].count(1)
``````

and

``````print len([e for e in stuff if e.b == 1])
``````

Which is the best method? Is there a better alternative? It seems that the count() method does not accept keys (at least in Python version 2.5.1.

Many thanks!

By : nicolaum

To hide `reduce` details, you may define a `count` function:

``````def count(condition, stuff):
return reduce(lambda s, x: \
s + (1 if condition(x) else 0), stuff, 0)
``````

Then you may use it by providing the condition for counting:

``````n = count(lambda i: i.b, stuff)
``````
By : Calvin

I would prefer the second one as it's only looping over the list once.

If you use `count()` you're looping over the list once to get the `b` values, and then looping over it again to see how many of them equal 1.

A neat way may to use `reduce()`:

``````reduce(lambda x,y: x + (1 if y.b == 1 else 0),list,0)
``````

The documentation tells us that `reduce()` will:

Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value.

So we define a `lambda` that adds one the accumulated value only if the list item's `b` attribute is 1.

By : Dave Webb