【问题标题】:While loop pythonwhile循环python
【发布时间】:2013-05-17 09:38:26
【问题描述】:

我是 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 循环仅在满足条件时运行。我错过了什么?谢谢

【问题讨论】:

  • 想想当 x 为 3 时会发生什么

标签: python while-loop


【解决方案1】:

您将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),except 当索引为 0 时,有效地跳过存在在close 中没有前面的元素。

演示:

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

【讨论】:

  • [elem - close[i - 1] for i, elem in enumerate(close) if i] 保存制作临时切片
  • @gnibbler:不错,那我就偷那个。 :-)
【解决方案2】:

看到这个:close[x+1]

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

【讨论】:

    猜你喜欢
    • 2014-11-02
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2014-05-30
    • 1970-01-01
    相关资源
    最近更新 更多