Python - 计算符号变化

Cap*_*ous 4 python list

我有一个从左到右阅读的数字列表.任何时候我在阅读序列时遇到符号更改我想要计算它.

X = [-3,2,7,-4,1,-1,1,6,-1,0,-2,1] 
X = [-, +, +, -, +, -, +, +, -, -,-,+]
Run Code Online (Sandbox Code Playgroud)

因此,在此列表中有8个符号更改.

当Item [0](在这种情况下为-3)为负时,它被认为是符号变化.此外,还会考虑列表中的任何0 [-].

任何帮助将不胜感激.

Mar*_*ers 13

您可以使用itertools.groupby计数正数和非正数的组:

>>> x = [-3,2,7,-4,1,-1,1,6,-1,0,-2,1] 

>>> import itertools
>>> len(list(itertools.groupby(x, lambda x: x > 0)))
Run Code Online (Sandbox Code Playgroud)

结果:

8
Run Code Online (Sandbox Code Playgroud)

在你的问题中,你说出你想要的:

  • 计算变化,而不是群体
  • 如果第一个元素不是正数,则计算额外的更改.

您可以通过直接测试第一个元素并调整结果来完成此操作:

>>> len(list(itertools.groupby(x, lambda x: x > 0))) - (x[0] > 0)
Run Code Online (Sandbox Code Playgroud)

或者在进行分组之前在输入前加一个正数,然后从结果中减去1:

>>> len(list(itertools.groupby(itertools.chain([1], x), lambda x: x > 0))) - 1
Run Code Online (Sandbox Code Playgroud)

注意你的输入列表是否可以为空 - 前一个解决方案会引发异常.

  • +1,因为我写的相同,除了它看起来像`len(list(itertools.groupby(X> x代表X中的x))) (2认同)

Chr*_*dal 5

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
Run Code Online (Sandbox Code Playgroud)