Python - 计数符号变化

11 投票
10 回答
16136 浏览
提问于 2025-04-15 23:20

我有一串数字,从左到右读取。每当我在读取这个序列时遇到符号变化,我就想要计数。

X = [-3,2,7,-4,1,-1,1,6,-1,0,-2,1] 
X = [-, +, +, -, +, -, +, +, -, -,-,+]

所以,在这个列表中,总共有8次符号变化。

当第一个项目 [0](在这个例子中是-3)是负数时,就算作一次符号变化。此外,列表中的任何0也被视为 [-]

任何帮助都会非常感激。

10 个回答

1

这里有一个用 fold 的解决方案,祝你玩得开心,自己去琢磨一下吧:

def lolwut((x,c), y):
    return (y, c+(x^y))

print reduce( lolwut ,(x > 0 for x in X), (True,0)) # 8
print reduce( lolwut ,(x > 0 for x in X), (False,0)) # 7
7
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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

19

你可以使用 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)))

结果:

8

在你的问题中,你提到你想要:

  • 统计变化,而不是组别
  • 如果第一个元素不是正数,还要额外统计一次变化。

你可以直接检查第一个元素,然后调整结果:

>>> len(list(itertools.groupby(x, lambda x: x > 0))) - (x[0] > 0)

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

>>> len(list(itertools.groupby(itertools.chain([1], x), lambda x: x > 0))) - 1

如果你的输入列表可能是空的,要小心 - 前一种方法会引发错误。

撰写回答