Пока l oop не изменит индекс - PullRequest
0 голосов
/ 20 июня 2020

Мне нужно написать код в Python, который возвращает первое положительное число в списке, используя while l oop. Это то, что у меня есть, но оно не работает.

def positive(num):
    n= num[0]

### Can't change anything above 

сначала я попробовал:

    i = 0
    while n <= 0:
        i += 1

но это не сработало, поэтому я попробовал:

    i = 0
    while i < len(num):
        n = num[i]
        while n <= 0:
            i += 1

##### Can't change below

    return n

Мне кажется, я понимаю, как использовать while l oop, но меня сбивает с толку изменение индекса в списке.

Ответы [ 6 ]

2 голосов
/ 20 июня 2020

Как отметил Мистер Мияги, предпочтительнее использовать for l oop. Вы также можете использовать while l oop:

def first_neg(num):
    i = 0
    while(i < len(num)):
        if(num[i] < 0):
            return num[i]
        i += 1
    return 1 # no negative numbers found
2 голосов
/ 20 июня 2020

Используйте for loop, что в основном то же самое, что и while l oop:

def first_neg(some_list):
    for item in some_list:
        if item < 0:
            return item

Или как while вариант:

def first_neg(some_list):
    i = 0
    while (i < len(some_list)):
        if some_list[i] < 0:
            return some_list[i]
        i += 1

Также существуют так называемые функции генератора, например itertools.dropwhile():

from itertools import dropwhile

lst = [0, 1, 2, 3, 4, -5, 6]

rest = dropwhile(lambda x: x >= 0, lst)
print(next(rest))

Все они будут давать

-5
1 голос
/ 26 июля 2020

Давайте сначала посмотрим, что не так в вашем коде или что необходимо исправить.

i = 0
while n <= 0:
    i += 1

Здесь вы использовали хороший лог c, но есть одна проблема. Ваш while l oop работает до n<=0, что правильно, если n - ваш текущий номер. В вашем коде вы просто обновляете i (индекс), а не текущий номер.

Например, возьмите num=[-2,-3,4,5], ваша функция должна вернуть 4. Позвольте нам dry -пробегать пока l oop. перед 1-й итерацией:

n=-2, i=0

L oop условие: n<=0 выполнено, поэтому l oop выполняется и i+=1 после 1-й итерации (что означает перед 2-й итерацией):

n=-2, i=1

Помните, мы не выполняли никаких операций с n, поэтому он остается как есть. Снова условие L oop: n<=0 выполнено, потому что -2 <= 0 Итак, мы делаем <code>i+=1 после 2-й итерации (что означает перед 3-й итерацией):

n=-2, i=2

Вы заметили, что в этом Кстати, условие while l oop никогда не нарушится? Таким образом, ваш while l oop будет работать бесконечно без вывода.

Итак, самый большой вопрос, который приходит нам в голову, - что, черт возьми, нам тогда делать? Простой ответ - обновить n, как показано ниже -

i = 0
while n <= 0:
    i += 1
    n=num[i]

Теперь, когда мы запустим это, n (текущий элемент) будет обновляться на каждой итерации l oop. То есть для каждой итерации значения n и i будут следующими:

итерация 1: до этой итерации: i=0, n=-2 l oop условие: n<=0 (выполнено) после эта итерация: i=1, n=-3 (n= num[i] , that is n=num[1]=-3)

итерация 2: до: i=1, n=-3 условие: n<=0 (выполнено) после: i = 2, n = 4

итерация 3: до: i=2, n=4 условие: n<=0 (не выполнено) после: l oop не выполняется

Следовательно, после завершения l oop, мы имеем i as 2, который является первым индекс положительного числа.

Есть еще небольшая проблема с этим кодом.

Могу я спросить вас, что произойдет, если все элементы num будут отрицательными? То есть, когда в num array / list

отсутствует положительный элемент, условие l oop n<=0, где n - текущий элемент, всегда будет выполняться, поэтому i будет обновлено до i+1 после каждой итерации.

Рассмотрим, когда i=length-1 и мы снова вводим while l oop, давайте проверим условие l oop: n=num[i]=num[length-1] и n<=0 Итак, мы входим в l oop и выполните:

i+=1

, то есть i=(length-1)+1, то есть i=length, а теперь n=num[i]=num[length], и все мы знаем, что в python индексация начинается с 0 и заканчивается на length-1. Как вы думаете, что произойдет, если мы попытаемся получить доступ к элементу с длиной индекса?

Tada ?, мы получим IndexError. Взгляните на приведенный ниже код для лучшего понимания.

a=[1,2,3]
print(a[0])
print(a[1])
print(a[2])
print(a[3])

Вывод:

1                                                                                                                       
2                                                                                                                       
3                                                                                                                       
Traceback (most recent call last):                                                                                      
  File "main.py", line 5, in <module>                                                                                   
    print(a[3])                                                                                                         
IndexError: list index out of range 

Итак, что нам делать, чтобы обработать эту ошибку в нашем while l oop? Просто поместите другое условие, что l oop должен работать до i<length, то есть l oop теперь становится

i = 0
while i<len(num) and n <= 0:
    i += 1
    n=num[i]

Итак, да, теперь он завершен. Я написал полную функцию ниже. Здесь, в этой функции, вместо использования n=num[i], а затем n<=0 в условии l oop, я напрямую использую num[i] в условии l oop.

def first_positive(num):
    i=0    # i is the current index
    while(i<len(num) and num[i]<=0):  # i<len(num) means run the while loop until there are elements in the num list
        i+=1
    if i==len(num):   # when there are no positive elements present in the list
        return "No positive element found"
    else:
        return num[i]
print(first_positive([-2,-3,5,10]))     # prints 5
print(first_positive([-2,-3,-5,10]))    # prints 10
print(first_positive([-2,-3,-5,-10]))   # prints No positive element found
0 голосов
/ 22 июня 2020
    li=[0,1,2,3,4,5,-2,7,8,9,-1]
    i=0
    flag=0
    while(i<len(li)):
       if(li[i]<0):
          flag=1
          break
       i+=1
if(flag==1):
   print('no is found',li[i])
    
else:
  print('no not found')
0 голосов
/ 20 июня 2020

Вам просто нужно увеличить i, чтобы переместить индекс

`

def get_first_neg(num):
    i = 0
    while i < len(num):
        if num[i] < 0:
           return num[i]
        i = i + 1 # or i += 1
0 голосов
/ 20 июня 2020

Чтобы сохранить

def first_neg(num):
    n= num[0] 

вышеуказанную часть, вы можете сделать что-то вроде этого:

def first_neg(num):
  n = num[0]
  i = 1
  while n >= 0 and i<len(num):
    n = num[i]
    i += 1
  if n < 0 : return n
  #else return some error msg saying that no negative num is in the list         
...