2017-06-18 53 views
-1

我写了一些代码,如下所示。用于将数字更改为0和1的Python数据检测器:IndexError:列表索引超出范围

a = [3, 2, 3, 4, 50, 60, 3, 70, 60, 4, 2, 3] 

def interval(data): 
    threshold = 50 
    n = [0 for i in a] 
    for i in data: 
     if data[i] < threshold and data[i+1] < threshold and data[i+2] < threshold : 
      n[i] = 1 
      n[i+2] = 1 
    return n 

print (interval(a)) 

## IndexError: list index out of range 

正如你可以看到上面,我有(a)含有一些数据,并且还一个阈值,其是50.在列表中(a)对应到1秒的每个元素的列表。数据是波形的,在这个数据集中有一个峰值。我想要做的是检测波从5(秒)到8(秒)的持续时间。有一点需要注意的是,峰值中的一些数据将低于阈值,但仅在很短的时间内。所以它应该被忽略,仍然被认为是在高峰期。因此,我要做的第一件事就是让峰值中的数据为0,其余(间隔)为1.因此,我在函数内创建一个新列表(n),并尝试在新列表(n)中包含0和1。所以最后的列表(n)应该是[1,1,1,1,0,0,0,0,0,1,1,1]。但是,当我运行上面的代码时,它会给出一个错误“IndexError:列表索引超出范围”。

如果有人知道如何解决这个问题,请告诉我。感谢!

+1

'我在data'不**不生成指数**,**它在元素迭代**,所以'i'将首先采取'3'作为值...您可以用'for in range(len(data)-2)'替换它。 –

+0

非常感谢!请参阅我上面问题的更新。我尝试了范围函数,它有点工作。但是这次它返回列表(n)为[1,1,1,1,0,0,0,0,0,1,0,1],这不是预期的。你可以看一看,看看代码出错了吗?谢谢! – ryan9025

回答

3

为什么不使用列表理解

>>> [int(x<50) for x in a] 
[1, 1, 1, 1, 0, 0, 0, 1, 1, 1] 
+0

谢谢! :)我没有使用列表理解是因为我有一个更大的数据集,如果我绘制数据,它就像一个波形。所以我想检测一下波浪之间的一些间隔。但是,波峰并不总是大于阈值(它可能会在少量时间内降低)。所以我想编写一个检测器来检测这些间隔,并将它们设置为1,并将波形部分设置为0.请让我知道是否有任何解决方法,谢谢! – ryan9025

+0

你现在不清楚,现在你编辑了你的问题。 –

+0

我已经更新了我对问题的描述。现在应该更清楚了。请检查我上面的编辑。谢谢!! – ryan9025

相关问题