2016-11-29 92 views
1

寫功能lucky_sevens(數字),它接受的 整數的數組,並且如果任意三個連續元素之和爲7。幸運第七集,連續3數之和在陣列== 7

返回true

爲什麼不生成True輸出?最後3個值之和= 7

def lucky_sevens(numbers): 
     x, y = 0, 3 
     sum_of_numbers = sum(numbers[x:y]) 
     while (sum_of_numbers != 7) and (y < len(numbers)): 
     x = x + 1 
     y = y + 1 
     if sum_of_numbers == 7: 
     return True 
     else: 
     return False 

    print(lucky_sevens([1,2,3,4,5,1,1])) 
+4

你從未改變'sum_of_numbers'。 – TigerhawkT3

+0

While函數不會改變x和y的值,改變sum_of_numbers的值嗎? – Jason

+0

爲什麼要改變和的值改變sum_of_numbers的值? – kindall

回答

1

如何爲

def lucky_sevens(numbers): 

     for x in range(len(numbers) - 2): 

      if sum(numbers[x:x+3]) == 7: 

       return True 

     return False 

或與您的原代碼簡單的東西,只是清理了一點點。

def lucky_sevens(numbers): 

    if len(numbers) < 3: 
     return False 

    x, y = 0, 3 

    sum_of_numbers = sum(numbers[x: y]) 

    while sum_of_numbers != 7 and y < len(numbers): 
     x += 1 
     y += 1 
     sum_of_numbers = sum(numbers[x: y]) 

    if sum_of_numbers == 7: 
     return True 
    return False 

您的錯誤出現在您的while循環中。當你在循環時,sum_of_numbers保持不變。相反,您必須在while循環內更​​新每個新的xy

也有一些重複的東西,如else: return False,可以簡化爲return False,因爲它只能到達該行,如果sum_of_numbers == 7是False。

最後x = x + 1可以寫在更常見的速記x += 1,與y = y + 1相同。

+1

這將對'lucky_sevens([2,2,2,2,2,7])'產生不正確的結果。 – TigerhawkT3

+1

@ TigerhawkT3固定 – Signal

+0

不,我不這麼認爲。 – TigerhawkT3

1

,當函數首先被調用的sum_of_numbers變量被分配前3個值的總和值在列表中,並且永遠不會被新xy值更新的問題,你可能要創建一個回調函數來實現該行爲。

既然這樣,你需要的sum聲明移入while循環,使之得到新xy值更新:

def lucky_sevens(numbers): 
    result = False 
    x, y = 0, 3 

    while (y <= len(numbers)): 
     if sum(numbers[x:y]) == 7: 
      result = True 
      break 
     x += 1 
     y += 1 
    return result 

print(lucky_sevens([1,2,3,4,5,1,1])) 
0

這應該做的伎倆:

def lucky_sevens(numbers): 
    if len(numbers) < 3: 
     return False 
    return 7 in [sum(numbers[i:i+3]) for i in range(0, len(numbers)-2)] 

print(lucky_sevens([1,2,3,4,5,1,1])) 
# True 

列表理解將一次移過列表中的3個數字,並計算每個三個整數集合的總和。如果7在該列表中,則有3個連續的數字總和爲7。否則,沒有。

有一點需要注意的是,做這種列表理解需要列表中有超過3個元素。這就是爲什麼if語句在那裏。

如果你想使用你的原始代碼,你只需要做一些調整。你的邏輯就在那裏,只需要一點清潔。

def lucky_sevens(numbers): 
    x, y = 0, 3 
    sum_of_numbers = sum(numbers[x:y]) 
    while (sum_of_numbers != 7) and (y < len(numbers)): 
    x = x + 1 
    y = y + 1 
    sum_of_numbers = sum(numbers[x:y]) 
    if sum_of_numbers == 7: 
    return True 
    else: 
    return False 

你只是需要重做sumwhile循環中。這樣,sum_of_numbers更新與每個循環和每個新的指數選擇。

+1

如果您用生成器表達式替換listcomp(括號而不是括號),則會發生短路。 – DSM