而循环python

Ren*_*eno 3 python while-loop

我是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
Run Code Online (Sandbox Code Playgroud)

它返回"IndexError:list index out of range"但我的理解是while循环仅在满足条件时运行.我错过了什么?谢谢

Mar*_*ers 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
Run Code Online (Sandbox Code Playgroud)

您的代码也可以简化为:

data = [elem - close[i - 1] for i, elem in enumerate(close) if i]
Run Code Online (Sandbox Code Playgroud)

这个列表理解:

  • 循环遍历所有元素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]
Run Code Online (Sandbox Code Playgroud)