列出python中的理解,请帮助我理解为什么下面的代码不起作用

时间:2019-06-30 14:06:45

标签: python list list-comprehension kaggle

下面是我为kaggle上的作业编写的代码。但是无法理解为什么它无法按预期工作。这是要求: “”“给出一段时间内提供的饭菜清单,如果     同一餐已经连续两天供应了,否则为False。 “”“

下面是编写的代码:

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

给定餐点的True预期返回值= ['Spam','Spam'],但改为False。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

    function defer([first, ...rest]) {
        return (...values) => rest.reduce((acc, str, i) => acc + values[i] + str, first);
    }
    
    var createPFunc = (template) => {
        return (string) => {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    console.log(template(string));
                    resolve();
                }, 2000);
            })
        }
    }
    
    var f1 = createPFunc(defer`String 1: ${'string'}`);
    var f2 = createPFunc(defer`String 2: ${'string'}`);
    
    f1(`search 1`).then(() => f2('search 2'))
    // result:
    // String 1: search 1
    // String 2: search 2