Powerful Interval Set operations.
Project description
Install
pip install intervalset2
Basic Use Case
- import
>>> from intervalset2 import IntervalSet, NEG_INF, POS_INF
- initialize an interval set (follow simply called "TVS")
>>> IntervalSet.parse_from_str('(-inf, -10) | (-3, 3) | 5 | (10, inf)')
(-inf, -10) | (-3, 3) | 5 | (10, inf) # a TVS all intervals is open
>>> IntervalSet.parse_from_str('(-inf, -10) | [-3, 3) | 5 | [10, inf)')
(-inf, -10) | [-3, 3) | 5 | [10, inf) # a TVS part of intervals is open
>>> IntervalSet.parse_from_str('(-inf, -10] | [-3, 3] | 5 | [10, inf)')
(-inf, -10] | [-3, 3] | 5 | [10, inf) # a TVS all intervals is close
>>> IntervalSet.parse_from_str('') # an empty TVS
>>> IntervalSet.empty_tvs() # get an empty TVS
>>> IntervalSet.inf_tvs() # get an infinite TVS
(-inf, inf)
>>> tvs = IntervalSet.parse_from_str('(2, 5) | 5 | (5, 8) | (7, 9) | (10, inf)')
>>> tvs # intervals will be merged automatically
(2, 9) | (10, inf)
>>> len(tvs) # the number of its intervals
2
>>> tvs[1] # TVS support __getitem__
(10, inf)
>>> tvs[:] # TVS support slice __getitem__
[(2, 9), (10, inf)]
>>> [2, 3, False, True] in tvs # TVS support __contains__
True
>>> 20 in tvs # TVS support __contains__ on discrete point
True
>>> tvs2 = tvs.copy() # get a copy
>>> tvs2 == tvs
True # all intervals of two TVS objects is same
>>> tvs2.is_disjoint(tvs) # whether a TVS overlap on other
False
>>> from datetime import date
>>> IntervalSet([[date.fromisoformat('2023-12-03'),
date.fromisoformat('2023-12-05'),
True, False]])
[2023-12-03, 2023-12-05) # also support other data type as interval
>>> IntervalSet([['a', 'c', True, False],['b', 'd', True, False]])
[a, d)
- add an interval into a tvs
>>> tvs1 = IntervalSet.parse_from_str('(0, 3] | (100, inf)')
>>> tvs1.add(3, 4)
>>> tvs1
(0, 4) | (100, inf)
>>> tvs1.add(4, 4)
>>> tvs1
(0, 4] | (100, inf)
- union
>>> tvs1 = IntervalSet.parse_from_str('(0, 3] | (100, inf)')
>>> tvs2 = IntervalSet.parse_from_str('(2, 5) | (-inf, -100)')
>>> tvs3 = IntervalSet.parse_from_str('[4, 9) | 0')
>>> tvs1.union(tvs2, tvs3)
(-inf, -100) | [0, 9) | (100, inf)
>>> tvs1.union() # also can passed in zero other interval sets
(0, 3] | (100, inf)
- intersection
>>> tvs1 = IntervalSet.parse_from_str('(0, 5] | (100, inf)')
>>> tvs2 = IntervalSet.parse_from_str('(2, 7) | (200, inf)')
>>> tvs3 = IntervalSet.parse_from_str('[4, 9) | (300, inf)')
>>> tvs1.intersection(tvs2, tvs3)
[4, 5] | (300, inf)
>>> tvs1.intersection() # also can passed in zero other interval sets
(0, 5] | (100, inf)
- difference
>>> tvs1 = IntervalSet.parse_from_str('(0, 10) | (100, inf)')
>>> tvs2 = IntervalSet.parse_from_str('(2, 7) | (200, inf)')
>>> tvs3 = IntervalSet.parse_from_str('[4, 9) | (300, inf)')
>>> tvs1.difference(tvs2, tvs3)
(0, 2] | [9, 10) | (100, 200]
>>> tvs1.intersection() # also can passed in zero other interval sets
(0, 10) | (100, inf)
- symmetric difference
>>> tvs1 = IntervalSet.parse_from_str('(0, 3] | (100, inf)')
>>> tvs2 = IntervalSet.parse_from_str('(2, 5) | (200, inf)')
>>> tvs3 = IntervalSet.parse_from_str('[4, 9) | (300, inf)')
>>> tvs1.symmetric_difference(tvs2, tvs3)
(0, 2] | (3, 4) | [5, 9) | (100, 200]
>>> tvs1.symmetric_difference() # also can passed in zero other interval sets
(0, 3] | (100, inf)
- complementary
>>> tvs1 = IntervalSet.parse_from_str('(0, 3] | (100, inf)')
>>> tvs1.complementary()
(-inf, 0] | (3, 100]
>>> tvs1 = IntervalSet.parse_from_str('-3 | (0, 2]')
>>> tvs2 = IntervalSet.parse_from_str('(3, 5)')
>>> tvs3 = IntervalSet.parse_from_str('[7, 9) | (300, inf)')
>>> IntervalSet.complementary_many(tvs1, tvs2, tvs3)
(-inf, -3) | (-3, 0] | (2, 3] | [5, 7) | [9, 300]
- other
- union also support | |=
- intersection also support & &=
- difference also support - -=
- symmetric difference also support ^ ^=
- complementary also support ~
FAQ
- for interval in a TVS, what required?
- must support compare methods, like lt, gt, ...
- follow-up plan?
- improve the performance of some methods
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
intervalset2-1.0.0.tar.gz
(16.6 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file intervalset2-1.0.0.tar.gz.
File metadata
- Download URL: intervalset2-1.0.0.tar.gz
- Upload date:
- Size: 16.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d467b862235df2bb33ad811a050500f8af0826263192ab98db1be6f50fb88307
|
|
| MD5 |
3ca171dad20f0f49f30e25b68563afa9
|
|
| BLAKE2b-256 |
dd3968d840ef02fe2aedd1a6cbddfb3c042e8a6124c699fe57207159493a2064
|
File details
Details for the file intervalset2-1.0.0-py3-none-any.whl.
File metadata
- Download URL: intervalset2-1.0.0-py3-none-any.whl
- Upload date:
- Size: 17.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e49bb1a52e4f6a4d1886c00c4213e8e80b3b2345f26ca43eafa0616d7db03fa
|
|
| MD5 |
68486f20e2e4a9b918c28d3ea9a11af6
|
|
| BLAKE2b-256 |
47255e29487cf583a407c5973bf074d315f2314f39e89e8bd6b0ba78ad238a1f
|