连续出现两次的列表推导式

List comprehensions where entry occurs twice in a row

我为 Kaggle 上的作业编写了代码。

"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."

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

给定 meals=['Spam', 'Spam'] 的预期 return 值为 True,但得到的却是 False。

在你的例子中,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)