Python中的While循环

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循环条件不满足时就不会执行,我错在哪里了?谢谢。


5
当 x 等于 3 时发生了什么。 - Colonel Panic
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()为每个元素生成一个索引,给我们提供了索引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] 这段代码可以避免创建临时的切片。 - John La Rooy
1
@gnibbler: 很不错,我会“借鉴”一下。 :-) - Martijn Pieters

2

看这里:close[x+1]

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接