Пожалуйста, помогите мне понять, почему не работает приведенный ниже код. - PullRequest
2 голосов
/ 30 июня 2019

Ниже приведен код, который я написал для задания на kaggle. Но не в состоянии понять, почему он не работает, как ожидалось. Вот требование: "" "Учитывая список блюд, поданных за определенный период времени, верните True, если одна и та же еда когда-либо подавалась два дня подряд, в противном случае - ложь. "" "

Ниже код написан:

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

Ожидаемое возвращаемое значение True для данных блюд = ['Spam', 'Spam'], но вместо этого получено False.

Ответы [ 2 ]

3 голосов
/ 30 июня 2019

Когда вы хотите сравнить два последовательных значения в диапазоне, вы можете использовать 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
3 голосов
/ 30 июня 2019

в вашем примере len(meals) равно 2, поэтому len(meals)-2 равно 0, поэтому диапазон пуст.

вам нужно только вычесть 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"]))

Выход:

Правда

Стоит отметить, что range в питоне не включает в себя параметр stop (т.е. list(range(1,5)) равен [1, 2, 3, 4])

...