减少python中的列表中的IndexError

时间:2015-07-03 15:42:36

标签: python

我对python很新,我一直收到这个错误。我需要知道代码有什么问题,当使用range()传递递减列表时它不会执行: IndexError:列表索引超出范围

def is_monotone(heights):

    j = 0
    if len(heights) == 0:
        return True
    for i in heights:
        if heights[j + 1] >= heights[j]:
            j += 1

            return True


        return False

4 个答案:

答案 0 :(得分:1)

您每次都会循环遍历将1添加到j的整个列表。如果您有n个项目的列表,则最高索引将为n-1。因此,当您到达最高项目时,j为n-1,但您正在检查height[j+1] >= heights[j]是否会尝试查找超出范围的索引n,因为该索引不存在。您可能需要添加一项检查,以查看是否j+1 > len(heights)

def is_monotone(heights):

    j = 0
    if len(heights) == 0:
        return True
    for i in heights:
        if j + 1 > len(heights):
            return True
        if heights[j + 1] >= heights[j]:
            j += 1

            return True


        return False

另请注意,对于任何大于两个项目的列表,heights[1] > heights[0]将返回True,因为您放置了return语句。

答案 1 :(得分:1)

问题来自:

for i in heights:
    if heights[j + 1] >= heights[j]:
        j += 1

在迭代height时,某个时间j + 1 = len(height),然后heights[j + 1]超出范围。

你应该像这样循环:

for i in range(len(heights) - 1):
    if heights[j + 1] >= heights[j]:
        j += 1

正如tobias指出的那样,不再需要j,您可以使用i代替。

for i in range(len(heights) - 1):
    if heights[i + 1] >= heights[i]:
        return True

答案 2 :(得分:1)

当您到达列表末尾时(当您有j = len(heights)-1时),索引j+1 = len(list)超出范围,从而引发IndexError异常。

但是,即使使用正确的索引编制,您的函数也不会告诉您列表是否单调!如果元素1大于元素0,它将返回True值。

有一个工作职能的提议:

def is_monotone(heights):
    if len(heights) == 0:
        return True
    steps = []
    for j in range(len(heights)-1):
        steps.append(heights[j+1]-heights[j])
    if all(step >= 0 for step in steps) or all(step <= 0 for step in steps):
        return True
    return False

答案 3 :(得分:1)

假设return False在for循环之外,否则只有在发送包含1个元素的列表时才会出错。

问题在于,当您发送递减列表(或包含1个元素的列表)时,您将迭代直到j成为最后一个元素的索引(即len(heights) - 1),因此当您尝试访问heights[j + 1],错误导致IndexError:List index out of range错误。

你应该只从0迭代到len(heights) - 2,你可以使用范围函数(在范围内你应该给len(heights) -1,因为范围不包括i时的最后一个元素。

示例 -

def is_monotone(heights):

    if len(heights) == 0:
        return True
    for j in range(len(heights)-1):
        if heights[j + 1] >= heights[j]:
            return True
    return False

但话又说回来,如果你的函数检查的是列表是否单调递增(所有元素都在增加),你的逻辑有点偏,当你发现下一个元素的单个实例时,你不应该返回True大于第一个。

相反,当您在连续索引处找到减少数字的实例并在for循环外返回True时,应该返回false。请注意,这仅在您的功能是检查数字是否按顺序递增时才会显示。

示例 -

def is_monotone(heights):

    if len(heights) == 0:
        return True
    for j in range(len(heights)-1):
        if heights[j + 1] < heights[j]:
            return False
    return True