Captain Cretaceous - 1 year ago 84

Python Question

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]`

`[-]`

Any help would be greatly appreciated.

Answer Source

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.