дополнение между двумя наборами интервалов в Python - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть два набора непересекающихся интервалов, и я хочу найти интервалы, содержащиеся только в одном из наборов (это своего рода симметрия c дополнение интервалов в наборах).

Для пример 1:

set1 = [[0, 2], [4, 10]]
set2 = [[1,2], [4, 10]]

и желаемые результаты:

sub_intervals_in_one_set_only = [[0,1]]

[[0,1]] в единственном числе в наборе 1 (в [0,2]), но не содержатся ни в каком интервале в наборе 2.

Например2:

set1 = [[0.1, 0.2], [0.4, 0.6], [0.65, 0.66], [0.8, 1]]
set2 = [[0, 0.21], [0.42, 0.6], [0.8, 1]]

и желаемые результаты:

sub_intervals_in_one_set_only = [[0,0.1],[0.2,0.21], [0.4,0.42], [0.65, 0.66]]

[0,0.1], [0.2,0.21] включены только в набор 2, [0.4,0.42], [0.65, 0.66] включены только в set1.

Я пытался найти пересечение с кодом здесь . Но от этого не получилось.

Буду рад любой помощи. Спасибо!

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Вы можете взглянуть на разработанную мной библиотеку portion (https://github.com/AlexandreDecan/portion). Он также доступен в PyPI (pip install portion).

import portion as P

set1 = [[0, 2], [4, 10]]
set2 = [[1,2], [4, 10]]

i1 = P.Interval(*[P.closed(x, y) for x, y in set1])
i2 = P.Interval(*[P.closed(x, y) for x, y in set2])

# Symmetric difference
print((i1 - i2) | (i2 - i1))

... отображает [0,1), обратите внимание на ), поскольку 1 не в дополнении (оно в set2).

Для второго примера:

set1 = [[0.1, 0.2], [0.4, 0.6], [0.65, 0.66], [0.8, 1]]
set2 = [[0, 0.21], [0.42, 0.6], [0.8, 1]]

i1 = P.Interval(*[P.closed(x, y) for x, y in set1])
i2 = P.Interval(*[P.closed(x, y) for x, y in set2])

# Symmetric difference
print((i1 - i2) | (i2 - i1))

... отображает [0,0.1) | (0.2,0.21] | [0.4,0.42) | [0.65,0.66]. Еще раз обратите внимание, что некоторые интервалы полуоткрыты.

1 голос
/ 05 апреля 2020

вы можете использовать:

from functools import reduce
from operator import xor
from itertools import chain


set1 = [[0.1, 0.2], [0.4, 0.6], [0.65, 0.66], [0.8, 1]]
set2 = [[0, 0.21], [0.42, 0.6], [0.8, 1]]

l = sorted((reduce(xor, map(set, chain(set1 , set2)))))
[l[i:i + 2] for i in range(0, len(l), 2)]

вывод:

[[0, 0.1], [0.2, 0.21], [0.4, 0.42], [0.65, 0.66]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...