2013-05-17 323 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。