Get number of items from list (or other iterable) with certain condition

count, functional-programming, list, python, sequence

Solution

You can use a generator expression:

>>> l = [1, 3, 7, 2, 6, 8, 10]
>>> sum(1 for i in l if i % 4 == 3)
2

or even

>>> sum(i % 4 == 3 for i in l)
2

which uses the fact that `True == 1` and `False == 0`.

Alternatively, you could use `itertools.imap` (python 2) or simply `map` (python 3):

>>> def my_condition(x):
...     return x % 4 == 3
... 
>>> sum(map(my_condition, l))
2

Problem

Assuming that I have a list with a huge number of items, ``` l = [ 1, 4, 6, 30, 2, ... ] ``` I want to get the number of items from that list, where an item satisfies a certain condition. My first thought was: ``` count = len([i for i in l if my_condition(l)]) ``` But if the filtered list also has a great number of items, I think that creating a new list for the filtered result is just a waste of memory. For efficiency, IMHO, the above call can't be better than: ``` count = 0 for i in l: if my_condition(l): count += 1 ``` Is there any functional-style way to get the # of items that satisfy the condition without generating a temporary list?

Original source

Related problems