Поиск отрицательных чисел в индексе и возникновении

#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. Возможно, вы правы. Отредактировал мой ответ и поставил предложение для своего кода на первое место.