Первый думаю, что вы должны знать, что del L[i]
удаляет i
-й элемент. (Не используйте L.remove(L[i])
;., Что смотрит на i
-й элемент, а затем ищет весь список до тех пор, пока не найдет равное значение, а затем удаляет этот)
Но обратите внимание, что при удалении L[3]
, а затем перейти к L[4]
, вы пропустили одно значение - оригинал L[4]
теперь L[3]
, и вам все равно нужно его проверить. Поэтому вы должны не увеличивать i
, пока не найдете значение, которое вы держите.
Но если вы просто зацикливаете все индексы, и вы удалили их по пути, вы сбегаете с конца. Таким образом, вам нужно уменьшать длину каждый раз, когда вы удаляете. Или вы также можете просто снова позвонить len(L)
и каждый раз проверять новую длину.
Один умный способ решить обе эти проблемы сразу - это отсчет назад, как в Brad Budlong's answer. Но это может облегчить ошибки fencepost.Итак, я сделаю это по-другому.
def rmNegative(L):
length = len(L)
i = 0
while i < length:
if L[i] < 0:
del L[i]
length -= 1
else:
i += 1
И все.
Если вы хотите знать, почему ваш существующий код является бесконечным циклом, давайте немного перейдем к его примеру.
Начнем с pos=len(L)-1
, поэтому мы идем в большой elif
. pos=pos
ничего не делает. Если это отрицательное число, вы удаляете его и переходите к новому len(L)-1
; если это положительное число, вы оставите его и перейдите к len(L)-2
. Если это 0, мы не делаем ничего, что означает pos=len(L)-1
, и мы просто будем постоянно смотреть на это 0 навсегда.
Итак, это один из способов получить бесконечный цикл. Но давайте предположим, что это не конец 0.
Если мы только что удалили отрицательное число, мы вернемся к elif
, и мы знаем, что это нормально, если 0.
Но если мы уже оставили положительное число, то теперь мы имеем pos=len(L)-2
, поэтому переходим к if
. Опять же, pos=pos
ничего не делает. Если это положительное число, мы копируем список сам по себе, который ничего не делает, а затем устанавливает pos=len(L)-2
. Это то же самое, что и есть. Итак, если последнее число будет положительным, мы будем продолжать смотреть на этот номер навсегда. Это еще один способ получить бесконечный цикл.
Что делать, если это отрицательно? Затем L[:]=[L[pos]]+L[0:]
добавляет значение, которое вы хотите удалить, во весь список (который по-прежнему включает в себя исходную копию значения), L[:]=L[1:]
удаляет значение, которое вы только что добавили, поэтому вы получаете те же значения в L
, с которых вы начали. Затем вы устанавливаете pos=len(L)-1
, который возвращается в конец списка. Мы знаем, что это сработает успешно, и снова вернемся к следующему слоту, который будет по-прежнему иметь одинаковую ценность, поэтому мы будем двигаться вперед и назад навсегда. Итак, этого достаточно, чтобы получить бесконечный цикл.
Что делать, если это было 0? Тогда мы ничего не делаем, поэтому pos
и L
никогда не меняются, так что это еще один способ получить бесконечный цикл.
Итак, как только мы получим положительный элемент в конце списка, все три возможности для следующего-последнего элемента являются бесконечными циклами.
Откат немного, единственное, что когда-либо набирает ваш код pos
, равняется len(L)-1
и len(L)-2
. Итак, даже если вы сделали все остальное правильно, как это возможно, возможно, когда-либо закончится в списке с более чем 2 неотрицательными цифрами?
Ваш список не работает для меня, не показывает мне никакого кода. Вы можете просто поместить свой код в свой пост. – Loocid
Я отредактировал его в ожидании подтверждения курса. –
Похоже, что первый блок - это комментарий? Я пропустил '' '' 'в своем первом редактировании. Может быть, лучше всего показывать только код, который будет работать? –