Question: I have a list of integers and I need to count how many of them are > 0.  

I'm currently doing it with a list comprehension that looks like this:

```
sum([1 for x in frequencies if x > 0])

```

It seems like a decent comprehension but I don't really like the "1"; it seems like a bit of a magic number. Is there a more Pythonish way to do this?

Answer: 
If you want to reduce the amount of memory, you can avoid generating a temporary list by using a generator:

```
sum(x > 0 for x in frequencies)

```

This works because `bool` is a subclass of `int`:

```
>>> isinstance(True,int)
True

```

and `True`'s value is 1:

```
>>> True==1
True

```

However, as Joe Golton points out in the comments, this solution is not very fast. If you have enough memory to use a intermediate temporary list, then [sth's solution](https://stackoverflow.com/a/2900103/190597) may be faster. Here are some timings comparing various solutions:

```
>>> frequencies = [random.randint(0,2) for i in range(10**5)]

>>> %timeit len([x for x in frequencies if x > 0])   # sth
100 loops, best of 3: 3.93 ms per loop

>>> %timeit sum([1 for x in frequencies if x > 0])
100 loops, best of 3: 4.45 ms per loop

>>> %timeit sum(1 for x in frequencies if x > 0)
100 loops, best of 3: 6.17 ms per loop

>>> %timeit sum(x > 0 for x in frequencies)
100 loops, best of 3: 8.57 ms per loop

```

Beware that timeit results may vary depending on version of Python, OS, or hardware. 

Of course, if you are doing math on a large list of numbers, you should probably be using NumPy:

```
>>> frequencies = np.random.randint(3, size=10**5)
>>> %timeit (frequencies > 0).sum()
1000 loops, best of 3: 669 us per loop

```

The NumPy array requires less memory than the equivalent Python list, and the calculation can be performed much faster than any pure Python solution.
I would like to point out that all said applies to lists. If we have a numpy array,
there are solutions that will be at least *fourty* times faster...

Summing up all solutions given and testing for efficiency, plus adding some more (had to modify the reduce code to be able to run it in Python 3), note that the last answer is in micros, not millis:
[![enter image description here](https://i.stack.imgur.com/AHQoK.png)](https://i.stack.imgur.com/AHQoK.png)

code in copy-pastable format:

```
import random
import functools
frequencies = [random.randint(0,2) for i in range(10**5)]
from collections import Counter
import numpy as np

%timeit len([x for x in frequencies if x > 0])   # sth
%timeit sum([1 for x in frequencies if x > 0])
%timeit sum(1 for x in frequencies if x > 0)
%timeit sum(x > 0 for x in frequencies)
%timeit functools.reduce(lambda x, y: x + (y > 0), frequencies)
%timeit Counter(frequencies)

#'-------Numpy-----------------------')
%timeit ((np.array(frequencies))>0).sum()
npf=np.array(frequencies)
#'-------Numpy without conversion ---')
%timeit (npf>0).sum()

```