0

我正在尝试按照 docstring 中的描述创建此函数,但要么我只通过了第一个 doctest,要么因 IndexError: list index out of range 而失败。如果我能以某种方式在循环内再次增加循环计数器而不会超出范围,我觉得这种当前的方法会起作用。我试过了

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])

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

PS 这个问题有可用的解决方案,但我想看看我的方法有什么问题或得到提示,而不是直接跳到解决方案。这是我的第一个问题,所以如果它没有遵循所有准则,请原谅。

4

2 回答 2

0

只记得最后一餐:

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

于 2020-05-18T13:44:13.350 回答
0

看起来您正在使用 连续检查 3 天x = (meals[i] == meals[i+1]) and (meals[i] == meals[i+2])。此外,这IndexError是由于您尝试使用元素访问列表的n+1th和元素这一事实引起的。为避免这种情况,您应该运行循环直到或根据需要。n+2thnn-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在找到重复项后立即返回 a。

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']))
于 2020-05-18T13:44:13.997 回答