2016-10-21 45 views
0

編寫一個函數/ first_neg,它將(可能爲空) 數字列表作爲輸入參數,找到第一個出現的負數,並返回索引(即posi/on在 列表中)。如果列表不包含負數,或者 爲空,則程序應返回無。使用while循環(並且 不適用於循環),並且一旦找到第一個負數,您的while循環應停止循環。索引號中的負數查找器

這是一個問題我的老師問我任何想法這是我做的:

def first_neg(list): 
    count = 0 
    for number in list: 
     if number < 0: 
      count += 1 
      return count 

Dosent似乎正常工作,我剛剛加入第一後希望能得到一些幫助

+0

不是你的問題,而是一個緊湊的答案:'def first_neg(l):next(idx for idx,i in enumerate(l)if i <0)' –

+0

@Chris_Rands不知道這是我還是你的代碼,但返回'None'。我認爲你錯過了一個'返回' – MooingRawr

+1

@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 

你想當您找到答案但每次都是forloops循環時,不會增加count。請注意,此方法返回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 

這是因爲枚舉創建一個列表中的項目「配對」,它是當前計數。枚舉從0開始計數,每次從列表中獲得一個項目。

另外作爲一個附註(我沒有改變它在我的答案,因爲我想你瞭解發生了什麼事)。不要將你的變量關鍵字命名爲list,tuple,int,str ...只是一個壞主意和習慣,它可以像你看到的那樣工作,但它可能會導致問題。

1

一旦遇到否定元素,立即返回索引。否則增量索引:

def first_neg(lst): 
     count = 0 
     while count < len(lst): 
      if lst[count] < 0: 
       return count 
      count = count + 1 
     return None 

注:更好,如果你使用枚舉()而不是使用額外的計數變量。您提到的代碼不是用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的建議。

+0

這太浪費了,生成負數的整個列表而不是第一個短路。在我對這個問題的評論中使用帶有'next'的發電機更好 –

+0

看起來這個人是初學者,所以不知道他是否知道發電機。 – Shasha99

+0

如果OP是初學者,那麼列表理解也不適合,並且循環的標準確實會短路 –