2016-11-29 4 views
1

написать функцию lucky_sevens (номера), который принимает в массиве целых чисел и возвращает истину, если любые три последовательных элементов подвести до 7.счастливчиков семерок, сумма 3 последовательных чисел в массиве == 7

Почему это не производит вывод 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

Зачем изменять значения и y, изменяя значение 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 оставался постоянным. Вместо этого вы должны обновить его для каждого нового x и y внутри цикла while.

Также некоторые повторяющиеся вещи, такие как else: return False, могут быть упрощены до return False, так как он может попасть только в эту строку, если sum_of_numbers == 7 является ложным.

Окончание x = x + 1 можно написать в более общем сокращении x += 1, то же самое происходит с y = y + 1.

+1

Это приведет к некорректному результату для 'lucky_sevens ([2, 2, 2, 2, 2, 7])'. – TigerhawkT3

+1

@ TigerhawkT3 Fixed – Signal

+0

Нет, я так не думаю. – TigerhawkT3

1

Проблема, что когда функция первая вызывается переменная sum_of_numbers получает присваивается значение суммы первых 3 значений в списке, и никогда не обновляется с новыми x, y ценности, вы, вероятно, хотите создайте функцию обратного вызова для достижения такого поведения.

Как она стоит, вам нужно переместить sum заявление в петлю while поэтому сумма обновляется с новыми x, y значений:

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. В противном случае нет.

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

Вам просто нужно повторить sum в пределах вашей while цикла. Таким образом, sum_of_numbers обновляет каждый цикл и каждый новый набор индексов.

+1

Если вы замените listcomp выражением генератора - скобки вместо скобок - тогда вы получите короткое замыкание. – DSM

Смежные вопросы