Skip to content

Instantly share code, notes, and snippets.

@BasicWolf
Last active August 29, 2015 14:15
Show Gist options
  • Save BasicWolf/9fccc6993822ecadc75f to your computer and use it in GitHub Desktop.
Save BasicWolf/9fccc6993822ecadc75f to your computer and use it in GitHub Desktop.
# -- Filter --
def filter_range(range_start, range_end, *exclusions):
def make_prange(start, stop):
return lambda x: start <= x <= stop
exclusion_predicates = [make_prange(start, stop)
for (start, stop) in exclusions]
filtered_range = (n for n in range(range_start, range_end + 1)
if not any(ef(n) for ef in exclusion_predicates))
return filtered_range
# [1, 2, ... 10, 21, 22, ... 30, 41, 42, ... 48, 50]
# -- Compress --
def zipped_range(rng):
el0 = next(rng)
for el in rng:
yield (el0, el)
el0 = el
# [(1, 2), ..., (9, 10), (10, 21), (21, 22), ... (48, 49), (49, 50)
def compressor(rng):
zrng = zipped_range(filtered_range)
el0, el1 = next(zrng)
yield el0
for (el0, el1) in zrng:
if el0 != el1 - 1:
yield el0
yield el1
yield el1
# [1, 10, 21, 30, 41, 50]
def extractor(rng):
crng = compressor(rng)
return zip(crng, crng)
# [(1, 10), (21, 30), (41, 50)]
# ---------------------------------------
full_range = (1, 50)
removable_ranges = [(11,20), (31,40)]
filtered_range = filter_range(1, 50, (11, 20), (31, 40))
#print(list(filtered_range))
print(list(extractor(filtered_range)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment