Оператор While останавливается на четырех

#python

#python

Вопрос:

Мне нужно написать вызываемую функцию stop_at_four , которая перебирает список чисел с помощью while цикла, добавляя каждое число в новый список, пока не появится число 4. Функция должна вернуть новый список.

Это мой код:

 def stop_at_four(x):
    new_list=[]
    accum=0
    while x[accum]!=4:
        new_list.append(x[accum])
        accum =1
    return new_list
  

Но в этом все еще есть ошибка, которую, я думаю, мне следует прекратить запускать, когда список дойдет до конца, но как я должен это исправить?

Я получаю следующую ошибку:

Ошибка: ошибка IndexError: индекс списка вне диапазона

Я тоже пробовал это:

 def stop_at_four(x):
    new_list=[]
    accum=0
    while accum<len(x):
        if x[accum]!=4:
            new_list.append(x[accum])
            accum =1
    return new_list
  

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

1. Вы уверены, что в списке, который получает функция, есть номер 4? (Я имею в виду x ) Для вашего второго примера. Вы помните, что списки начинают свой индекс с 0?

Ответ №1:

Ваш код в порядке, с ним всего 2 проблемы:

  1. Вы не обрабатываете случай, когда список пуст
  2. Вы не рассматриваете случай, когда 4 отсутствует в списке

Исправление вашего кода:

 def stop_at_four(x):
    # empty list case
    if not x:
        return x
    new_list=[]
    accum=0
    # making sure accum wont exceed the list len
    while accum < len(x) and x[accum]!=4:
        new_list.append(x[accum])
        accum =1
    return new_list
  

Итак, первое условие — просто убедиться, что список содержит что-либо. Второй (в случае, если вы хотите использовать while цикл) — сначала проверить, accum больше ли длина списка, если это так, условие будет False выполнено, и цикл прервется.

Обратите внимание, что в этом конкретном случае я бы использовал for цикл и перебирал элемент списка следующим образом: for elem in x: тогда у вас не будет никаких проблем с индексацией.

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

1. accum < len(x) and x[accum]!=4 имеет ли значение, какие из них будут первыми, а какие следующими для and statenment

2. @GEH_L да. Если это x[accum]!=4 будет первым и accum больше, то len(x) вы получите ошибку, которую вы получили, но для противоположного, если первое условие — False python остановится и вернется False к условию

Ответ №2:

В вашем втором подходе вам придется объединить оба условия вместе, чтобы избежать бесконечного цикла (он не выходит из цикла, если элемент равен 4)

while accum < len(x) and x[accum] != 4:

Ответ №3:

Это то, что вы хотите? если список не содержит 4, он немедленно останавливается, и ошибок не будет. И если мы передадим пустой список, он немедленно остановится

 def stop_at_four(lst):
    if len(lst) != 0:
        if 4 in lst:
            new_list = []

            for ele in lst:
              if lst[ele] != 4:
                  new_list.append(lst[ele])
              else:
                  break
            return new_list
        else:
            print("List doesn't contain 4!")
    else:
        print("Empty Lists Not Acccepted!")

print(stop_at_four([0, 1, 2, 3, 4, 5, 6, 7]))

  

Надеюсь, это решит вашу проблему

Ответ №4:

Код повторяется вечно, когда список x имеет 4 .

потому accum что итератор as не обновляется, если x[accum] найти 4 в цикле.

давайте проследим за кодом шаг за шагом.

Как x = [1,4] , когда это так acuum=0 и x[0] != 4 истинно. затем accum 1 теперь выполняется accum =1 в первом цикле.

Во втором цикле x[1] != 4 значение равно False, НО accum НЕ обновляется вечно, поскольку оно может быть изменено только тогда, когда условие истинно.

 def stop_at_four(x):
    new_list=[]
    accum=0
    while accum<len(x):
         if x[accum] != 4:
              new_list.append(x[accum])
              accum =1
         else:        # Add here
               break  # to break
    return new_list


print(stop_at_four([1,2,3,4,5,6]))

  

Ответ №5:

Скорее всего, ошибка возникнет, когда вы передадите пустой список в свою функцию, попробуйте проверить длину, и да, вам нужно проверить, присутствует ли 4 в списке или нет, верните список таким, какой он есть в этих случаях.

 def stop_at_four(x):
    if len(x)<1 or 4 not in x:
        return(x)
    else:
        new_list=[]
        accum=0
        while x[accum]!=4:
            new_list.append(x[accum])
            accum =1
        return new_list