Как найти сумму интервалов python

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    There are numerous ways to initialize the list with the elements, but sometimes, its required to initialize the lists with the numbers in a sliced way and find its summation. This can be custom and hence knowledge of this can come handy. Let’s discuss certain ways in which this can be done. 

    Method #1 : Using list comprehension + enumerate() + sum() The list comprehension can do the possible iteration part and enumerate can help in the part of logic and checking for the valid elements required in the list. The sum() is used to perform summation. 

    Python3

    test_list = list(range(50))

    print ("The original list is : " + str(test_list))

    N = 5

    K = 15

    res = sum([i for j, i in enumerate(test_list) if j % K < N ])

    print ("The modified range sum list : " + str(res))

    Output : 

    The original list is : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49] The modified range sum list : 490

    Time Complexity: O(n) where n is the number of elements in the list “test_list”. The list comprehension + enumerate() + sum() is used to perform the task and it takes O(n) time.
    Auxiliary Space: O(n) additional space of size n is created where n is the number of elements in the list “test_list”.

      Method #2 : Using itertools.compress() + itertools.cycle() + sum() The above two function can combine to facilitate the solution of the discussed problem. The cycle function can to the task of repetition and the compress function can be beneficial when it comes to clubbing the segments together. The sum() is used to perform summation. 

    Python3

    from itertools import compress, cycle

    test_list = list(range(50))

    print ("The original list is : " + str(test_list))

    N = 5

    K = 15

    func = cycle([True] * N + [False] * (K - N))

    res = sum(list(compress(test_list, func)))

    print ("The modified range sum list : " + str(res))

    Output : 

    The original list is : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49] The modified range sum list : 490

    Time Complexity: O(n*n), where n is the number of elements in the list “test_list”.
    Auxiliary Space: O(1), constant extra space is required

    Last Updated :
    07 May, 2023

    Like Article

    Save Article

    This was the question:

    Write a function called sum_range that accepts 2 integer values as
    parameters and returns the sum of all the integers between the two
    values, including the first and last values. The parameters may be in
    any order (i.e. the second parameter may be smaller than the first).
    For example:

    result = sum_range(1, 1)
    print(result) 1

    result = sum_range(2, 4) print(result) 9

    result = sum_range(3, 2)
    print(result) 5

    my codes are as below, I dont know where it went wrong
    but when I test the codes, it returned ‘none’ when (2,4) (3,2) were entered

    def sum_range(x,y):
        if x == y:
            return x
    
        if x<y:
            sum(range(x,y))
            return
        if x>y:
            sum(range(y,x))
            return
    

    asked Jul 31, 2014 at 10:50

    user3672933's user avatar

    7

    You could do better (at least I think), here is my code for that:

    def sum_range(a, b):
      return sum(range(min(a,b),max(a,b)+1))
    

    answered Jul 31, 2014 at 10:58

    ex0ns's user avatar

    ex0nsex0ns

    1,1168 silver badges18 bronze badges

    1

    You were very close but forgot to return the actual value from the calculations. If you just type «return», you will return None and not the result from the sum.

    You also did not include the last number in the range in the sum. See corrected code below:

    def sum_range(x, y):
        if x == y:
            return x
        if x < y:
            return sum(range(x, y+1))
        if x > y:
            return sum(range(y, x+1))
    

    answered Jul 31, 2014 at 10:57

    Christer Nissen's user avatar

    4

    You need to return the sum which you are not doing in the x<y and x>y cases. You should

    return sum(range(x,y)) or return sum(range(y,x)) as appropriate.

    Note also that there is a bug in your range() expressions — «including the first and last values». Hint: What does range(1,3) output?

    answered Jul 31, 2014 at 10:58

    mhawke's user avatar

    mhawkemhawke

    83.9k9 gold badges115 silver badges136 bronze badges

    def sum_range(x,y):
        if x == y:
            return x
        elif x < y:
            s = 0
            for i in range(x,y):
                s += x+(x+1)
            return s
        elif x > y:
            s = 0
            for i in range(y,x):
                s += y+(y+1)
            return s
    

    This is done without using sum() function.

    answered Jul 31, 2014 at 11:14

    Sesha's user avatar

    SeshaSesha

    2021 silver badge5 bronze badges

    97 / 93 / 81

    Регистрация: 10.01.2016

    Сообщений: 662

    Записей в блоге: 13

    1

    Пересекающиеся интервалы

    22.10.2020, 13:05. Показов 12145. Ответов 22


    Студворк — интернет-сервис помощи студентам

    Добрый день!
    Есть список из списков интервалов [[1, 3], [2, 5], [6, 8]]. Как узнать, если в этом списке пересекающиеся интервалы?



    0



    Status 418

    Эксперт Python

    3841 / 2125 / 568

    Регистрация: 26.11.2017

    Сообщений: 4,987

    Записей в блоге: 2

    22.10.2020, 13:07

    2

    что значит интервалы?



    0



    97 / 93 / 81

    Регистрация: 10.01.2016

    Сообщений: 662

    Записей в блоге: 13

    22.10.2020, 13:24

     [ТС]

    3

    [1, 3], [2, 5], [6, 8] — интервалы. Как видно, [1, 3] пересекается с [2, 5]. Лучше представить целые числа на оси Х.



    0



    Fudthhh

    Модератор

    Эксперт Python

    2869 / 1572 / 508

    Регистрация: 21.02.2017

    Сообщений: 4,197

    Записей в блоге: 1

    22.10.2020, 13:27

    4

    Лучший ответ Сообщение было отмечено SW Developer как решение

    Решение

    Python
    1
    2
    3
    4
    5
    6
    7
    
    intervals = [[1, 3], [2, 5], [6, 8]]
    intervals.sort()
    for i, interval in enumerate(intervals[:-1]):
        if interval[1] > intervals[i + 1][0]:
            print(interval, "⋂", intervals[i + 1])
     
    # [1, 3] ⋂ [2, 5]

    Добавлено через 24 секунды
    SW Developer, Это называется пересечение отрезков на прямой.



    1



    Status 418

    Эксперт Python

    3841 / 2125 / 568

    Регистрация: 26.11.2017

    Сообщений: 4,987

    Записей в блоге: 2

    22.10.2020, 13:28

    5

    алгоритмом заметающей прямой



    1



    SW Developer

    97 / 93 / 81

    Регистрация: 10.01.2016

    Сообщений: 662

    Записей в блоге: 13

    22.10.2020, 13:53

     [ТС]

    6

    DmFat, спасибо!
    Только здесь

    Python
    1
    
    intervals.sorted()

    надо изменить на

    Python
    1
    
    sorted(intervals)



    0



    1303 / 843 / 409

    Регистрация: 12.03.2018

    Сообщений: 2,305

    22.10.2020, 13:56

    7

    SW Developer, list.sort()



    2



    Модератор

    Эксперт Python

    2869 / 1572 / 508

    Регистрация: 21.02.2017

    Сообщений: 4,197

    Записей в блоге: 1

    22.10.2020, 13:58

    8

    SW Developer, Тогда ты создашь новый список, а исходный список останется не отсортированым, немного поправил, глянь



    0



    97 / 93 / 81

    Регистрация: 10.01.2016

    Сообщений: 662

    Записей в блоге: 13

    22.10.2020, 14:04

     [ТС]

    9

    DmFat, да я уже понял разницу этих двух функций. Еще раз спасибо! В моем случае — лучше sorted().



    0



    Fudthhh

    Модератор

    Эксперт Python

    2869 / 1572 / 508

    Регистрация: 21.02.2017

    Сообщений: 4,197

    Записей в блоге: 1

    22.10.2020, 14:16

    10

    Лучший ответ Сообщение было отмечено SW Developer как решение

    Решение

    SW Developer, не учел что некоторые интервалы могут пересекаться с несколькими интервалами:

    Python
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    intervals = [[1, 3], [2, 4], [2, 5], [6, 8]]
    intervals.sort()
    for i, current_interval in enumerate(intervals):
        for follow_interval in intervals[i + 1:]:
            if current_interval[1] <= follow_interval[0]:
                break
            print(current_interval, "⋂", follow_interval)
     
    # [1, 3] ⋂ [2, 4]
    # [1, 3] ⋂ [2, 5]
    # [2, 4] ⋂ [2, 5]



    1



    97 / 93 / 81

    Регистрация: 10.01.2016

    Сообщений: 662

    Записей в блоге: 13

    22.10.2020, 14:29

     [ТС]

    11

    DmFat, вот и я сейчас на отладке заметил. )

    Добавлено через 4 минуты
    И еще возник вопрос: как это понять «Пересекающиеся интервалы должны учитываться только один раз»?



    0



    Модератор

    Эксперт Python

    2869 / 1572 / 508

    Регистрация: 21.02.2017

    Сообщений: 4,197

    Записей в блоге: 1

    22.10.2020, 14:31

    12

    SW Developer, то бишь [1, 3] и [2, 4], тоже самое что [2, 4] и [1, 3]



    0



    Status 418

    Эксперт Python

    3841 / 2125 / 568

    Регистрация: 26.11.2017

    Сообщений: 4,987

    Записей в блоге: 2

    22.10.2020, 14:32

    13

    Цитата
    Сообщение от DmFat
    Посмотреть сообщение

    не учел что некоторые интервалы

    это будет O(n*log(n)) ? Думаю тут «квадрат».

    Цитата
    Сообщение от SW Developer
    Посмотреть сообщение

    Пересекающиеся интервалы должны учитываться только один раз

    Вы напишите полное задание.



    0



    SW Developer

    97 / 93 / 81

    Регистрация: 10.01.2016

    Сообщений: 662

    Записей в блоге: 13

    22.10.2020, 14:45

     [ТС]

    14

    Для этого и нужна сортировка?

    Добавлено через 2 минуты

    Цитата
    Сообщение от eaa
    Посмотреть сообщение

    Вы напишите полное задание.

    Все писать не буду, интересует только эта часть:
    «Реализуйте функцию, которая принимает на вход список интервалов и возвращает сумму всех длин
    интервалов. Пересекающиеся интервалы должны учитываться только один раз.»

    Добавлено через 4 минуты
    Если функция

    Python
    1
    
    return sum_interval

    ,
    то при чем здесь «Пересекающиеся интервалы должны учитываться только один раз.»?

    Добавлено через 6 минут
    Либо в самой функции прописать код, предложенныйDmFat, а потом уже

    Python
    1
    
    print(sum_interval)

    вместо

    Python
    1
    
    return sum_interval

    ?

    Где sum_interval — сумма всех длин интервалов.



    0



    Status 418

    Эксперт Python

    3841 / 2125 / 568

    Регистрация: 26.11.2017

    Сообщений: 4,987

    Записей в блоге: 2

    22.10.2020, 14:47

    15

    Проще говоря нужно найти сумму длин всех интервалов после объединения



    0



    97 / 93 / 81

    Регистрация: 10.01.2016

    Сообщений: 662

    Записей в блоге: 13

    22.10.2020, 14:53

     [ТС]

    16

    Цитата
    Сообщение от eaa
    Посмотреть сообщение

    Проще говоря нужно найти сумму длин всех интервалов после объединения

    Получается, нужно создать новый список и в нем уже производить суммирование?



    0



    Status 418

    Эксперт Python

    3841 / 2125 / 568

    Регистрация: 26.11.2017

    Сообщений: 4,987

    Записей в блоге: 2

    22.10.2020, 14:56

    17

    лучше стек

    Добавлено через 1 минуту
    в принципе можно сразу суммировать



    0



    Эксперт Python

    7256 / 4045 / 1780

    Регистрация: 27.03.2020

    Сообщений: 6,871

    22.10.2020, 15:41

    18



    1



    97 / 93 / 81

    Регистрация: 10.01.2016

    Сообщений: 662

    Записей в блоге: 13

    22.10.2020, 16:10

     [ТС]

    19

    eaa,

    Цитата
    Сообщение от eaa
    Посмотреть сообщение

    Проще говоря нужно найти сумму длин всех интервалов после объединения

    — вы правы.

    Добавлено через 1 минуту
    Gdez, спасибо! Посмотрю.



    0



    eaa

    Status 418

    Эксперт Python

    3841 / 2125 / 568

    Регистрация: 26.11.2017

    Сообщений: 4,987

    Записей в блоге: 2

    22.10.2020, 16:22

    20

    Лучший ответ Сообщение было отмечено SW Developer как решение

    Решение

    Python
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    a = [[1, 3], [2, 5], [6, 8]]
    a.sort()
    prev = a[0]
    res = 0
    for curr in a[1:]:
        if prev[1] > curr[0]:
            prev = [prev[0], max(prev[1], curr[1])]
        else:
            res += prev[1]-prev[0]  # длина
            prev = curr
    res += prev[1]-prev[0]  # длина
    print(res)



    1



    IT_Exp

    Эксперт

    87844 / 49110 / 22898

    Регистрация: 17.06.2006

    Сообщений: 92,604

    22.10.2020, 16:22

    20

    src/solution.py

    Реализуйте функцию sum_of_intervals(), которая принимает на вход список интервалов и возвращает сумму всех длин интервалов. В данной задаче используются только интервалы целых положительных чисел, которые представлены в виде списков. Первое значение интервала всегда будет меньше, чем второе значение. Например, длина интервала [1, 5] равна 4, а длина интервала [5, 5] равна 0. Пересекающиеся интервалы должны учитываться только один раз.

    from solution import sum_of_intervals
    sum_of_intervals([
        [1, 1],
    ])
    # 0
    sum_of_intervals([
        [1, 2],
        [50, 100],
    [60, 70],
    ])
    # 51
    sum_of_intervals([
        [1, 2],
        [5, 10],
    ])
    # 6
    

    Для полного доступа к испытанию нужен базовый план

    Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

    Получить доступ


    Перейти к содержимому

    Меню

    Сумма диапазона чисел

    Напишите функцию, которая будет принимать начальное и конечное число в диапазоне чисел и возвращать сумму всех чисел этого диапазона.

    Примеры

    sum_problem(-10, 1) ➞ -54
    sum_problem(-20, 5) ➞ -195
    sum_problem(90, 45) ➞ 3105

    Варианты решения

    def sum_problem(a, b):
        return sum(range(min(a, b), max(a, b) + 1))
    7 
    def sum_problem(a, b):
        return (a + b) * (abs(a - b) + 1) // 2

    Понравилась статья? Поделить с друзьями:

    Не пропустите также:

  • Как найти редактор групповых политик windows 10
  • Как найти хорошего семейного врача
  • Как составить бюджетный прогноз
  • Как исправить кривую оправу очков
  • Как найти формат в компасе

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии