【问题标题】:List comprehensions where entry occurs twice in a row连续出现两次条目的列表推导
【发布时间】:2021-08-14 15:38:19
【问题描述】:

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

“给定一段时间内供应的餐食列表,如果连续两天供应同一餐食,则返回 True,否则返回 False。”

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

给定meals=['Spam', 'Spam'] 的预期返回值为 True,但得到了 False。

【问题讨论】:

  • 应该是len(meals) -1

标签: python list list-comprehension kaggle


【解决方案1】:

在您的示例中,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"]))

输出:

是的

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

【讨论】:

    【解决方案2】:

    当您要比较一个范围内的两个连续值时,您可以使用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
    

    【讨论】:

    • 最好使用生成器表达式而不是带有anyall 的列表组合。这两个功能都是短路的,也就是说,一旦结果确定,它们就会退出。因此,any 在找到 True 结果后立即停止测试。所以如果你给它一个发电机,当any 退出时发电机就会停止。但是,如果您将 any 提供给列表组合,则必须在 any 开始工作之前创建整个列表。
    【解决方案3】:
    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
    

    【讨论】:

    • 欢迎来到 StackOverflow。虽然此代码可能会回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将提高​​答案的长期价值。
    【解决方案4】:
    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)
    

    【讨论】:

    • 欢迎来到 StackOverflow。虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    相关资源
    最近更新 更多