2013-05-17 321 views
3

我是新来的python,并有问题看到为什么这段代码不起作用。我希望它返回[10,122,2]。虽然循环python

close = [5000,5010,5132,5134] 

def difference(): 
    x = 0 
    data = [] 
    while x < len(close): 
     diff = close[x+1]-close[x] 
     data.append(diff) 
     x = x + 1 
    return data 

返回“IndexError:列表索引超出范围”,但我的理解是,当条件满足while循环只运行。我错过了什么?谢谢

+5

想想x会发生什么3 –

回答

7

您将x限制为小于len(close),但列表的最后一个索引位于len(close) - 1(基于索引0)。这意味着在您的循环x + 1的最后一次迭代中将等于len(close)并超出界限。

这工作:

while x < len(close) - 1: 
    diff = close[x+1]-close[x] 
    data.append(diff) 
    x = x + 1 

你的代码也可以简化为:

data = [elem - close[i - 1] for i, elem in enumerate(close) if i] 

这个列表解析:

  • 遍历在close所有元素。
  • 使用enumerate()生成每个元素的索引,给我们提供索引i和元素elem
  • 计算当前元素和close上一个元素之间的差异(使用索引 - 1)中,除了当该指数0,对于其存在在close没有前面的元素的一种元素有效地跳过。

演示:

>>> close = [5000,5010,5132,5134] 
>>> [elem - close[i - 1] for i, elem in enumerate(close) if i] 
[10, 122, 2] 
+1

''[elem - close [i - 1] for i,elem in enumerate(close)if i]'''''''''''保存临时片 –

+1

@gnibbler:好的,我会那就偷走吧。 :-) –

+0

哇,不错的缩短代码。非常感谢,非常有帮助。 – Reno

2

看到这一点:close[x+1]

这就是问题所在。 事实上,根据你写的条件,x总是一个有效的索引。但在最后一次迭代中,您会发现x+1不是。如果你想避免超出范围,你将不得不从你正在检查的最大值中减去1。