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.
You could use `len()` on the filtered list:

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

```