Issue
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.
Solution
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:
- to count the changes, not the groups
- to count an extra change if the first element is not positive.
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.
Answered By - Mark Byers
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.