Как я могу найти сумму последовательных последовательностей элементов в списке? - PullRequest
0 голосов
/ 15 мая 2019

Мне нужно написать функцию, которая дает список целых чисел L, он возвращает True, если список содержит последовательную последовательность значений, сумма которых равна n, и False в противном случае.

Допустим, мой список: L = [2,2,4,4,0,0,2,8] и n = 3. Функция должна возвращать False, потому что нет последовательных значений, суммирующих до 3.

требование: модули Pythonне разрешено

Я пытался с:

def consecutive(L,n):
    for i in range(len(L)):
        for j in range(i+1, len(L)):
            if sum(L[i:j+1])==n:
                return True
    return False
L = [2,2,4,4,0,0,2,8]
consecutive(L,3)

Это частично работает, потому что когда я устанавливаю n=12, он возвращает True.Я понимаю, что есть что-то, что можно исправить с помощью нарезки, но я не могу понять, что это такое.

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Основная проблема проста: в этой ситуации диапазон должен быть len + 1 , иначе он потерпит неудачу в некоторых случаях.Рабочий код:

def consecutive(L, n):
    for i in range(len(L)+1):
        for j in range(i+1,len(L)+1):
            s=sum(L[i:j])
            if s == n:
                print(i,j,s,'TRUE')  #DEBUG: remove when done
                #return True         #uncomment this to reintegrate
            else: print(i,j,s)       #DEBUG: remove when done

    return False

L = [2,2,4,4,0,0,2,-3]
consecutive(L,3)

еще лучше, в вашем примере вы не показывали отрицательные числа.Если у вас нет недостатков, вы можете сделать код более эффективным, пропустив цикл, когда он превышает значение поиска, n:

def consecutive(L, n):
    for i in range(len(L)+1):
        for j in range(i+1,len(L)+1):
            s=sum(L[i:j])
            if s == n:
                print(i,j,s,'TRUE')     #DEBUG: remove when done
                #return True            #uncomment
            elif s > n:
                print(i,j,s,'too big')  #DEBUG: remove when done
                break
            else: print(i,j,s)          #DEBUG: remove when done

    return False

L = [2,2,4,4,0,0,2,1]
consecutive(L,3)
0 голосов
/ 15 мая 2019

Наивным способом было бы перебирать каждую начальную потенциальную начальную точку (каждый индекс) и каждый размер окна (любое число от 0 до длины списка):

def consecutive(L, n):
    for i in range(len(L)):
        for window_size in range(len(L)):
            if sum(L[i:i + window_size]) == n:
                return True
    else:
        return False

Обратите внимание, что это можно легко улучшить, начиная с двойной проверки нескольких окон одного и того же окна (например, если список имеет длину 3, тогда L[2:4] и L[2:3] будут одинаковыми).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...