From 3c685d18f565624e831cf9fb5bbfd380ce9ef45c Mon Sep 17 00:00:00 2001 From: Adam Circle Date: Tue, 15 Nov 2022 10:40:16 -0500 Subject: [PATCH 1/4] Add remove data method --- intervaltree/intervaltree.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/intervaltree/intervaltree.py b/intervaltree/intervaltree.py index 2548eed..05613bf 100644 --- a/intervaltree/intervaltree.py +++ b/intervaltree/intervaltree.py @@ -467,6 +467,28 @@ def symmetric_difference_update(self, other): other.remove(iv) self.update(other) + def remove_data(self, data, points=None): + """ + Removes all intervals containing the given data. Providing a set of points contained by the + intervals will speed up the operation considerably, but will only succeed if all the + intervals with the given data also contain the points. + """ + if data is None: + raise ValueError("IntervalTree: No data submitted.") + + if points is not None: + root = self.top_node + ivs = set() + for point in points: + ivs |= root.search_point(point, set()) + ivs_with_data = [iv for iv in ivs if iv.data == data] + for iv in ivs_with_data: + self.discard(iv) + else: + ivs_without_data = [iv for iv in self.items() if iv.data != data] + self.clear() + self.__init__(ivs_without_data) + def remove_overlap(self, begin, end=None): """ Removes all intervals overlapping the given point or range. From d39ec1e312a0ba594e32ddd1bec4a2029485470e Mon Sep 17 00:00:00 2001 From: Adam Circle Date: Tue, 15 Nov 2022 10:46:34 -0500 Subject: [PATCH 2/4] clarify docstring --- intervaltree/intervaltree.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/intervaltree/intervaltree.py b/intervaltree/intervaltree.py index 05613bf..eb3eaa6 100644 --- a/intervaltree/intervaltree.py +++ b/intervaltree/intervaltree.py @@ -469,9 +469,9 @@ def symmetric_difference_update(self, other): def remove_data(self, data, points=None): """ - Removes all intervals containing the given data. Providing a set of points contained by the - intervals will speed up the operation considerably, but will only succeed if all the - intervals with the given data also contain the points. + Removes all intervals containing the given data. If a set of points is provided, + only intervals containing the points AND containing the given data will be removed. + Providing a set of points speeds up the operation considerably. """ if data is None: raise ValueError("IntervalTree: No data submitted.") From 00ef50ee3ebacf6cad015f5b7cbc42779edb3bef Mon Sep 17 00:00:00 2001 From: Adam Circle Date: Tue, 15 Nov 2022 11:02:06 -0500 Subject: [PATCH 3/4] update README.md and docstring --- README.md | 2 ++ intervaltree/intervaltree.py | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/README.md b/README.md index fb2c6fb..1aa6b67 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,8 @@ Features * `tree.remove_overlap(point)` * `tree.remove_overlap(begin, end)` (removes all overlapping the range) * `tree.remove_envelop(begin, end)` (removes all enveloped in the range) + * `tree.remove_data(data)` (removes all intervals containing this data) + * `tree.remove_data(data, point)` (removes all intervals containing this data and overlapping the point) * Point queries * `tree[point]` diff --git a/intervaltree/intervaltree.py b/intervaltree/intervaltree.py index eb3eaa6..e999f3d 100644 --- a/intervaltree/intervaltree.py +++ b/intervaltree/intervaltree.py @@ -149,6 +149,15 @@ class IntervalTree(MutableSet): >>> tree IntervalTree() + Delete intervals, containing certain data: + >>> tree = IntervalTree([Interval(-10, 0, "x"), Interval(0, 10, "y"), Interval(-10, 0, "y")]) + >>> tree + IntervalTree([Interval(-10, 0, "x"), Interval(0, 10, "y"), Interval(-10, 0, "y")]) + >>> tree.remove_data("y", set(1)) + IntervalTree([Interval(-10, 0, "x"), Interval(-10, 0, "y")]) + >>> tree.remove_data("y") + IntervalTree([Interval(-10, 0, "x")]) + Point queries:: >>> tree = IntervalTree([Interval(-1.1, 1.1), Interval(-0.5, 1.5), Interval(0.5, 1.7)]) From c956c20029d12b02738c6c70334d0aa1b2df144a Mon Sep 17 00:00:00 2001 From: Adam Circle Date: Tue, 15 Nov 2022 11:03:04 -0500 Subject: [PATCH 4/4] fixed spacing --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1aa6b67..59314ae 100644 --- a/README.md +++ b/README.md @@ -45,8 +45,8 @@ Features * `tree.remove_overlap(point)` * `tree.remove_overlap(begin, end)` (removes all overlapping the range) * `tree.remove_envelop(begin, end)` (removes all enveloped in the range) - * `tree.remove_data(data)` (removes all intervals containing this data) - * `tree.remove_data(data, point)` (removes all intervals containing this data and overlapping the point) + * `tree.remove_data(data)` (removes all intervals containing this data) + * `tree.remove_data(data, point)` (removes all intervals containing this data and overlapping the point) * Point queries * `tree[point]`