我对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
答案 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