我正在尝试在列表中找到零交叉的数量。我正在使用的代码是:
for i in range(1, len(value)):
zerocrossing = 0
if ((value[i-1]) > 0 and value[i] < 0):
zerocrossing += 1
if ((value[i-1]) < 0 and value[i] > 0):
zerocrossing += 1
stdio.writeln('The Number of Zero Crossings is ' + str(zerocrossing))
此代码不会给我任何错误,但不能给我正确的答案。如果我给它输入[1.0, -1.0, 1.0]
,它给我1
,但它应该给2
。我在做什么错了?
答案 0 :(得分:1)
您要在每次循环迭代中将zerocrossing
设置为零。将zerocrossing = 0
移到for循环之外。
答案 1 :(得分:1)
l = [1.0, -1.0, 1.0]
zero_x = 0
for idx, item in enumerate(l[:-1]):
if l[idx] < 0 and l[idx+1] > 0:
zero_x +=1
if l[idx] > 0 and l[idx+1] < 0:
zero_x +=1
2
答案 2 :(得分:0)
正如其他人已经确定的那样,您的直接问题是要在循环内初始化计数器,从而导致每次迭代将其重置为零。
该评论在另一个答案中提出,该算法不考虑包含一个或多个零的列表。如果出于某种原因您不想过滤列表,则可以通过过滤或以下类似方法来解决。
我对python有点生疏,所以可能会有更多的pythonic方法来实现这一目标。
l = [1.0, 0.0, -1.0,0.0, 0.0, 1.0]
def zero_x(l):
x =0 #Count
s0=0; s1=0 #This and next sign
sign = lambda a: (a>0) - (a<0)
cross = lambda a,b,lim: (s0 !=lim and s1!=lim and s0 !=s1)
for idx, item in enumerate(l[:-1]):
s0=s0 if l[idx]==0 else sign(l[idx]) #Keep previous sign if zero
s1=sign(l[idx+1])
x+=cross(s0,s1,0)
return x
print(zero_x(l))