3

我是 python 新手,在理解为什么这段代码不起作用时遇到问题。我希望它返回 [10,122,2]。

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:list index out of range”,但我的理解是while循环仅在满足条件时运行。我错过了什么?谢谢

4

2 回答 2

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()为每个元素生成索引,为我们提供 indexi和 element elem
  • 计算当前元素与 in 中的前一个元素之间的差异close(使用索引 - 1),除非索引为0,有效地跳过 中没有前一个元素的一个元素close

演示:

>>> close = [5000,5010,5132,5134]
>>> [elem - close[i - 1] for i, elem in enumerate(close) if i]
[10, 122, 2]
于 2013-05-17T09:39:57.523 回答
2

看到这个:close[x+1]

那就是问题所在。实际上,根据您编写的条件,x 将始终是有效索引。但在最后的迭代中,你会发现x+1并非如此。如果你想避免超出这一行的范围,你必须从你检查的最大值中减去 1。

于 2013-05-17T09:41:11.800 回答