CodingBat прогрев Python-2 массива 123, однострочное решение не будет работать

#python #return #boolean-expression

#python #Возврат #логическое выражение

Вопрос:

Проблема в этом:

Учитывая массив целых чисел, верните True, если последовательность чисел 1, 2, 3 где-то появляется в массиве.

Можно найти здесь:

https://codingbat.com/prob/p193604

Мое итеративное решение, которое работает, таково:

 has_seq = False

for i in range(len(nums) - 2):
    if nums[i: i   3] == [1, 2, 3]:  # do indexes i .. i   3 equal 1, 2, 3
        has_seq = True
        break  # exit loop if condition met

return has_seq
  

Я пытаюсь превратить его в однострочный возврат, код, который у меня пока есть для этого, таков:

 return bool(True for i in range(len(nums) - 2) if nums[i: i   3] == [1, 2, 3])
  

Это не работает и всегда возвращает True, даже если тестовые примеры показывают, что этого не должно быть. Что я делаю не так? Если для этого невозможно выполнить возврат в одну строку, почему?

Ответ №1:

Вы предоставляете bool объект генератора, и, насколько я знаю, генераторы всегда правдивы.

Вы хотите any здесь вместо bool :

 return any(nums[i: i   3] == [1, 2, 3] for i in range(len(nums) - 2))
  

Комментарии:

1. Вам не нужно True for . Условие if можно переместить в начало. any(nums[i:i 3] == [1, 2, 3] for i in range(len(nums) - 2))

2. Carcigenicate и @FrankYellin спасибо за помощь до сих пор. Я пробовал ваши решения, но они все еще не работают. Когда я пытаюсь скомпилировать, я получаю сообщение об ошибке «any», которое не определено. Сработало ли это решение на их веб-сайте для вас?

3. Что вы подразумеваете под «когда я пытаюсь [скомпилировать]»? Вы используете Python? any() — это встроенная функция.

4. @LogicallySpeakingLaura Я не могу придумать, как any не было бы определено, если только они явно не запретили это для этой задачи.

5. Нет, я имею в виду, когда пытаюсь отправить решение на их веб-сайте, а не в среде разработки Python. Может быть, они просто не примут его по какой-то причине.