I have a list of numbers I am reading left to right. Anytime I encounter a sign change when reading the sequence I want to count it.
X = [-3,2,7,-4,1,-1,1,6,-1,0,-2,1]
X = [-, +, +, -, +, -, +, +, -, -,-,+]
So, in this list there are 8 sign changes.
When Item [0]
(in this case -3) is negative it is considered a sign change. Also, any 0 in the list is considered [-]
.
Any help would be greatly appreciated.
You can use itertools.groupby
to count the groups of positive and non-positive numbers:
>>> x = [-3,2,7,-4,1,-1,1,6,-1,0,-2,1]
>>> import itertools
>>> len(list(itertools.groupby(x, lambda x: x > 0)))
Result:
8
In your question you state that you want:
You can do this either by testing the first element directly and adjusting the result:
>>> len(list(itertools.groupby(x, lambda x: x > 0))) - (x[0] > 0)
or by prepending a positive number to the input before doing the grouping then subtracting 1 from the result:
>>> len(list(itertools.groupby(itertools.chain([1], x), lambda x: x > 0))) - 1
Watch out if your input list could by empty - the former solution will raise an exception.
X = [-3,2,7,-4,1,-1,1,6,-1,0,-2,1]
last_sign = 1
sign_changes = 0
for x in X:
if x == 0:
sign = -1
else:
sign = x / abs(x)
if sign == -last_sign:
sign_changes = sign_changes + 1
last_sign = sign
print sign_changes
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With