在没有索引错误的情况下递增循环内的 Python 循环计数器:列出索引超出范围



我正在尝试按照文档字符串中的说明创建此函数,但要么我只通过了第一个文档测试,要么因索引错误而失败:列出索引超出范围。我觉得如果我能以某种方式在循环内再次增加循环计数器而不会超出范围,那么这种当前的方法将起作用。我试过了

def menu_is_boring(meals):
"""Given a list of meals served over some period of time, return True if the
same meal has ever been served two days in a row, and False otherwise.
>>> menu_is_boring(['Egg', 'Spam'])
False
>>> menu_is_boring(['Spam', 'Eggs', 'Spam', 'Spam', 'Bacon', 'Spam'])
True
"""
for i in range(len(meals)):
x = (meals[i] == meals[i+1]) and (meals[i] == meals[i+2])
return x

为了解决索引错误,我尝试使用 while 循环,但因语法错误而失败:

for i in range(len(meals)):
x = (meals[i] == meals[(while i<len(meals): i+=1 )]) and (meals[i] == meals[while i<len(meals):i+=2])

嵌套循环会以某种方式工作还是我过度复杂化了?

附言该问题有可用的解决方案,但我正在尝试查看我的方法有什么问题或获得提示,而不是直接跳转到解决方案。这是我的第一个问题,所以如果它没有遵循所有准则,请原谅我。

只记得最后一顿饭:

def menu_is_boring(meals):
last = None
for meal in meals:
if meal == last:
return True
last = meal
return False

看起来您连续 3 天都在检查x = (meals[i] == meals[i+1]) and (meals[i] == meals[i+2]).此外,IndexError是由于您尝试访问包含n元素的列表的n+1thn+2th元素引起的。为避免这种情况,您应该根据需要运行循环直到n-1n-2

所以你所要做的就是:

for i in range(len(meals)-1):  # Run the loop till n-1
x = meals[i] == meals[i+1] # Check for nth and n+1th meal to be same
return x

话虽如此,本节不会解决您的问题,并且将始终返回最后一对餐的值,因为x在循环的每次迭代中都会被覆盖。为了解决这个问题,您可以在发现重复项后立即返回True

def menu_is_boring(meals):
for i in range(len(meals)-1):
if meals[i] == meals[i+1]:
return True
return False

可以通过调用函数并打印其返回值来测试它。

print (menu_is_boring(['Spam', 'Eggs', 'Spam', 'Spam', 'Bacon', 'Spam']))

最新更新