列表综合连续出现两次进入的地方



我在kaggle上写了代码。

"给定一段时间内提供的饭菜清单,如果连续两天提供同一餐,则返回true,否则为虚假。"

def menu_is_boring(meals):
    return any([ meals[l] == meals[l+1] for l in range(0,len(meals)-2) ])

给定 meals=['Spam', 'Spam']的true的预期返回值,但得到了错误。

在您的示例中, len(meals)是2,所以 len(meals)-20,因此范围为空。

您只需要减去1。

尝试以下操作:

def menu_is_boring(meals):
    return any([meals[l] == meals[l + 1] for l in range(0, len(meals) - 1)])

print(menu_is_boring(["Spam", "Spam"]))

输出:

true

值得注意的是,Python的range不包括stop参数(即list(range(1,5))[1, 2, 3, 4](

当您要在一个范围内比较两个连续值时,您可以使用 zip创建对并在对上进行迭代并进行比较:

any(i == j for i, j in zip(meals, meals[1:]))

在这里我使用了发电机表达式,但是如果需要,您可以免费使用列表理解。

另一个选项是使用itertools.tee创建两个迭代器,从第二个迭代器中消耗第一个元素,然后通过对迭代:

def menu_is_boring(meals): 
    it_1, it_2 = itertools.tee(meals) 
    next(it_2) 
    return any(i == j for i, j in zip(it_1, it_2))

这将比第一个要慢。

所以:

In [1104]: def menu_is_boring(meals): 
      ...:     return any(i == j for i, j in zip(meals, meals[1:])) 
      ...:                                                                                                                                                                                                  
In [1105]: meals=['Spam', 'Spam']   
In [1106]: menu_is_boring(meals)                                                                                                                                                                            
Out[1106]: True
In [1107]: def menu_is_boring(meals): 
      ...:     it_1, it_2 = itertools.tee(meals) 
      ...:     next(it_2) 
      ...:     return any(i == j for i, j in zip(it_1, it_2)) 
      ...:                                                                                                                                                                                                  
In [1108]: menu_is_boring(meals)                                                                                                                                                                            
Out[1108]: True
def menu_is_boring(meals):
    counter=0
    
    for i in range(0, len(meals) - 1):
        if meals[i]==meals[i+1]:
            counter=counter+1
            
    if counter!=0:
        return True
    else:
        return False
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.
    """
    
    for i in range(len(meals)):
         for j in range(len(meals)-(i+1)):            
            #print(meals[i])
            #print(meals[j+(i+1)])
            if meals[i] == meals[j+(i+1)]:               
                return True                
    return False
           
meals= ["water","pear","apple","egg", "orange","apple"]
menu_is_boring(meals)

相关内容

最新更新