Assuming that I have a list with huge number of items.
l = [ 1, 4, 6, 30, 2, ... ]
I want to get the number of items from that list, where an item should satisfy certain condition. My first thought was:
count = len([i for i in l if my_condition(l)])
But if the my_condition() filtered list has also great number of items, I think that creating new list for filtered result is just waste of memory. For efficiency, IMHO, 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 achieve to get the # of items that satisfy certain condition without generating temporary list?
Thanks in advance.
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 int(True) == 1
.
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