#python #list #function #loops #range
#python #Список #функция #циклы #диапазон
Вопрос:
Напишите функцию / on first_neg, которая принимает (возможно, пустой) список чисел в качестве входного параметра, находит первое вхождение отрицательного числа и возвращает индекс (т. Е. положение / вкл в списке) этого числа. Если список не содержит отрицательных чисел или он пуст, программа должна вернуть None. Используйте цикл while (а не цикл for), и ваш цикл while должен прекратить цикл, как только будет найдено первое отрицательное число.
Это вопрос, который задал мне мой учитель, есть идеи по поводу того, что я сделал:
def first_neg(list):
count = 0
for number in list:
if number < 0:
count = 1
return count
Кажется, что Dosent работает правильно, я только что присоединился к 1-му сообщению, надеюсь, смогу получить некоторую помощь
Комментарии:
1. Не ваша проблема, а лаконичный ответ:
def first_neg(l): next(idx for idx,i in enumerate(l) if i < 0)
2. @Chris_Rands Не уверен, я это или ваш код, но это возвращает
None
. Я думаю, вам не хватаетreturn
3. @MooingRawr Упс, так и должно быть
return next(...
, конечно!
Ответ №1:
x = [1,2,3,-5]
def first_neg(list):
count = 0
for number in list:
count = 1 #moved it outside of the if
if number < 0:
return count
print(first_neg(x)) #prints 4
Вы хотите увеличивать значение count
не тогда, когда нашли ответ, а каждый раз, когда выполняете forloops
циклы. Обратите внимание, что этот метод возвращает 4
, который является четвертым элементом в списке, а не индексом, индекс списка начинается с 0, поэтому для доступа к нему было бы 3
. Возьмем наш список, x = [1,2,3,-5]
он -5
находится в четвертом слоте списка, но для доступа к нему мы должны вызвать x[3]
, поскольку индексация списков начинается с 0.
Если вы хотите вернуть индекс списка, в котором найдено первое отрицательное число, попробуйте это:
x = [1,2,3,-5]
def first_neg(list):
for count, number in enumerate(list):
if number < 0:
return count
print(first_neg(x)) # prints 3
Это происходит потому, что enumerate создает «сопряжение» элемента в списке, и это текущее количество. Enumerate просто отсчитывает от 0 каждый раз, когда получает элемент из списка.
Также в качестве примечания (я не изменил его в своем ответе, так как хотел, чтобы вы поняли, что происходит). Не называйте свои переменные ключевыми словами, такими как list, tuple, int, str… Просто плохая идея и привычка, это работает, как вы можете видеть, но это может вызвать проблемы.
Ответ №2:
Немедленно верните индекс, как только вы обнаружите отрицательный элемент. В противном случае увеличьте индекс:
def first_neg(lst):
count = 0
while count < len(lst):
if lst[count] < 0:
return count
count = count 1
return None
Примечание: Лучше использовать enumerate(), а не использовать дополнительную переменную count. Упомянутый вами код написан не на языке pythonic.
Вы также можете попробовать это:
def first_neg(lst):
res = [i for i,x in enumerate(lst) if x<0]
return None if res == [] else res[0]
Приведенный выше код можно улучшить с помощью генераторов, как предложил @Chris_Rands.
Комментарии:
1. Это довольно расточительно — генерировать весь список отрицательных чисел вместо короткого замыкания на первом из них. Лучше использовать генератор с
next
, как в моем комментарии к вопросу2. Похоже, парень новичок. Так что не уверен, знает ли он о генераторе.
3. Если OP является новичком, то понимание списка также не подходит, и стандартный цикл for, конечно, приводит к короткому замыканию
4. Возможно, вы правы. Отредактировал мой ответ и поставил предложение для своего кода на первое место.