#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 проблемы:
- Вы не обрабатываете случай, когда список пуст
- Вы не рассматриваете случай, когда 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
statenment2. @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