Python - 计数符号变化
我有一串数字,从左到右读取。每当我在读取这个序列时遇到符号变化,我就想要计数。
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
如果你的输入列表可能是空的,要小心 - 前一种方法会引发错误。