python_morsels/parse_ranges/parse_ranges.py

58 lines
1.7 KiB
Python
Raw Normal View History

def parse_ranges_v1(range_string):
"""This version causes a memory error for huge ranges..."""
ranges = [tuple(map(int, r.split("-"))) for r in range_string.split(",")]
result = []
for start, stop in ranges:
result = [*result, *list(range(start, stop + 1))]
for number in result:
yield number
def parse_ranges_v2(range_string):
"""This version seems more memory efficient."""
ranges = [tuple(map(int, r.split("-"))) for r in range_string.split(",")]
for start, stop in ranges:
for number in range(start, stop + 1):
yield number
def parse_ranges_v3(range_string):
"""This version handles single digits, Bonus2."""
ranges = [tuple(map(int, r.split("-"))) for r in range_string.split(",")]
for limits in ranges:
if len(limits) == 1:
yield limits[0]
else:
start, stop = limits
for number in range(start, stop + 1):
yield number
2020-12-21 23:50:20 +01:00
def parse_ranges_v4(range_string):
"""My take at Bonus3."""
# We prepare the data
range_string = range_string.replace("->", "-")
# We extract integer tuples from the data
ranges = []
for subrange in range_string.split(","):
splited = subrange.split("-")
try:
item = tuple(map(int, splited))
except ValueError:
# This item shall then contains text in the 2nd part
item = (int(splited[0]),)
ranges.append(item)
# We procede as before
for limits in ranges:
if len(limits) == 1:
yield limits[0]
else:
start, stop = limits
for number in range(start, stop + 1):
yield number
parse_ranges = parse_ranges_v4