【问题标题】:Why is this going out of range?为什么会超出范围?
【发布时间】:2018-09-28 17:30:53
【问题描述】:

我收到 IndexError: list index out of range 错误。我不确定为什么。有什么建议吗?

代码试图查看数字列表是否是算术级数,在这种情况下,每个数字都加 2。

def is_arith_progession(num_list):

    delta = num_list[1] - num_list[0]
    for num in num_list:
        if not (num_list[num + 1] - num_list[num] == delta):
        return False
    else:
        return True

print(is_arith_progession([2, 4, 6, 8, 10]))

【问题讨论】:

  • 您永远不会在代码中的任何地方施加2 的限制。 delta 是否总是定义为列表中前两个元素之间的值差?
  • for num in num_list: 遍历列表的 。然后,您使用 value+1 对其进行索引:num_list[num + 1] - 没有多大意义....如果你给它一个[3,2,1]的列表,第一个已经不在bounds(这个列表只有从 0 到 2 的索引。

标签: python python-3.x indexing error-handling


【解决方案1】:

您正在尝试在 for 循环的第二次迭代中访问 num_list 数组的第 5 个元素。第一次迭代后num 变为 4,因此程序在尝试评估 num_list[num + 1] 时崩溃。

num 变量保存列表中的实际元素。它不是元素的索引。

要迭代索引,您可以尝试for num in range(len(num_list) - 1),这应该可以解决问题。 (括号内注-1)

【讨论】:

  • 我故意不使用 range(len(num_list) - 1)。试着让它更漂亮一点:) 谢谢你的回复
  • @nateph 然后你可能想添加额外的变量previous 来访问上一次迭代的循环元素。您在第 i 次迭代中设置此变量并在第 (i+1) 次中使用它。
【解决方案2】:

这个:

for num in num_list:
    if not (num_list[num + 1] - num_list[num] == delta):
        return False

几乎可以肯定不会像你认为的那样做。当您定义for num in num_list: 时,这意味着num 是列表num_list 中的一个itemnum 不是索引。因此,如果您的列表是[2, 4, 6, 8, 10],那么当num4(即列表中的第二项)时,您将超出界限,因为您的输入列表的长度仅为5,并且您尝试访问索引num+1 ,即5(索引从0开始,所以5越界)

你可能想要这样的东西:

# Start at index 1, or you'll always return false since delta == index1 - index0
for index in range(1, len(num_list)-1):
    if not (num_list[num + 1] - num_list[num] == delta):
        return False

或者更pythonic(注意没有索引):

# Again start at index1, zip will handle the edge case of ending nicely so we don't go OB
for num, next_num in zip(num_list[1:], num_list[2:]):
    if not (next_num - num == delta):
        return False

【讨论】:

    【解决方案3】:

    您正在迭代 ,而不是数组的索引。因此,num_list[num] 可能超出范围。由于您引用了i+1 元素,因此迭代到i < n-1

    for i, _ in enumerate(num_list[:-1]):
        if num_list[i+1] - num_list[i]...
    

    【讨论】:

    • 我其实很喜欢这个答案。谢谢
    【解决方案4】:

    两件事:

    • numnum_list 的一个元素,而不仅仅是一个索引。获取索引将是for num in range(len(num_list)):,您实际上是在调用num_list[num_list[i]]
    • 即使它是一个索引,对于数组中的最后一个索引 num,您正在调用 numlist[num+1],它超出了数组范围,因为 num 已经是最后一个了;

    执行for INDEX in range(len(num_list)-1):if not (num_list[INDEX + 1] - num_list[INDEX] == delta):。应该这样做。

    【讨论】:

      猜你喜欢
      • 2018-11-27
      • 2022-08-10
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 2015-11-05
      相关资源
      最近更新 更多