[Tutor] increment a counter inside generator

Steven D'Aprano steve at pearwood.info
Thu Mar 14 02:45:55 CET 2013


On 14/03/13 08:12, Abhishek Pratap wrote:

>>> import numpy as np
>>>
>>> count = 0
>>> [ count += 1 for num in np.random.random_integers(1,100,20) if num > 20]
>>>
>>>   File "<ipython-input-45-0ba0e51b7644>", line 2
>>>      [ count += 1 for num in np.random.random_integers(1,100,20) if num > 20]
>>>               ^
>>> SyntaxError: invalid syntax
[...]
> I just used a very contrived example to ask if we can increment a
> counter inside a generator. The real case is more specific and
> dependent on other code and not necessarily useful for the question.

Not everything can happen inside a list comprehension or generator comprehension.
They are both deliberately kept simple, and can only include an expression.

Since count += 1 is not an expression, you cannot use it directly inside a list comp. Some possible solutions:

1) wrap it in a helper function:

count = 0

def incr():
     global count
     count += 1

values = [incr() or expr for num in np.random.random_integers(1, 100, 20) if num > 20]


2) Use a for loop:

count = 0
for num in np.random.random_integers(1, 100, 20):
     if num > 20:
         count += 1

3) Use len:

values = [num for num in np.random.random_integers(1, 100, 20) if num > 20]
# or if you prefer:
# values = filter(lambda x: x > 20, np.random.random_integers(1, 100, 20))

count = len(values)



4) Use sum:

count = sum(1 for num in np.random.random_integers(1, 100, 20) if num > 20)



-- 
Steven


More information about the Tutor mailing list