Itertools.accumulate, чтобы найти объединение интервалов (преобразовать из уменьшения в накопление) - PullRequest
0 голосов
/ 31 января 2019

Я, кажется, разработал правильную операцию reduce, чтобы найти объединение интервалов, только чтобы понять, что reduce дает вам окончательный результат.Поэтому я посмотрел документацию и понял, что на самом деле я должен использовать accumulate.

Мне нужен кто-то, кто поможет мне преобразовать это reduce в accumulate, поэтому у меня есть промежуточные интервалы

Приведенный ниже код является примером того, как я использовал reduce.Я предполагаю, что промежуточные значения могут быть сохранены с использованием accumulate.Я не уверен, возможно ли это вообще. Но я посмотрел на примеры того, как accumulate дает вам список элементов, где каждый элемент является промежуточным вычисленным результатом.

example_interval = [[1,3],[2,6],[6,10],[15,18]]

def main():

    def function(item1, item2):


        if item1[1] >= item2[0]:

            return item1[0], max(item1[1], item2[1])

        else:

            return item2

    return reduce(function, example_interval)

Чтобы понять проблему,[1, 3], [2, 6] можно уменьшить до [1, 6], поскольку item1[1] >= item2[0], [1, 6] затем берется как item1, а затем сравнивается с [6,10], равным item2, чтобы получить [1, 10].[1, 10] затем сравнивается с конечным элементом [15, 18], в данном случае он не объединяется, поэтому конечный результат равен [1, 10], [15, 18].

Я знаю, как решить эту проблему без reduceи accumulate. У меня просто есть общий интерес к пониманию того, как я могу использовать accumulate для репликации этой задачи, где хранятся промежуточные значения.

1 Ответ

0 голосов
/ 26 июля 2019
from itertools import accumulate

def function(item1, item2):
    if item1[1] >= item2[0]:
        return item1[0], max(item1[1], item2[1])
    return item2

example_interval = [(1,3),(2,6),(6,10),(15,18)]
print(list(accumulate(example_interval, function)))

Результат:

[(1, 3), (1, 6), (1, 10), (15, 18)]

Обратите внимание, что я изменил элементы на example_interval со списков на кортежи.Если вы этого не сделаете, когда item1[1] < item2[0], возвращается значение item2, которое является объектом списка, но если item[1] >= item2[0], возвращается выражение item1[0], max(item1[1], item2[1]), которое преобразуется в кортеж:

example_interval = [[1,3],[2,6],[6,10],[15,18]]
print(list(accumulate(example_interval, function)))

Теперь вывод:

[[1, 3], (1, 6), (1, 10), [15, 18]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...