parse_ranges: first attempt with Bonus1.

This commit is contained in:
Cacahuete 2020-12-21 23:14:20 +01:00
parent 7ac0068aa2
commit b1e27e7699
2 changed files with 61 additions and 0 deletions

View file

@ -0,0 +1,19 @@
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
parse_ranges = parse_ranges_v2

View file

@ -0,0 +1,42 @@
import unittest
from parse_ranges import parse_ranges
class ParseRangesTests(unittest.TestCase):
"""Tests for parse_ranges."""
def test_three_ranges(self):
self.assertEqual(list(parse_ranges("1-2,4-4,8-10")), [1, 2, 4, 8, 9, 10])
def test_with_spaces(self):
self.assertEqual(
list(parse_ranges("0-0, 4-8, 20-21, 43-45")),
[0, 4, 5, 6, 7, 8, 20, 21, 43, 44, 45],
)
def test_return_iterator(self):
numbers = parse_ranges("0-0, 4-8, 20-21, 43-45")
self.assertEqual(next(numbers), 0)
self.assertEqual(list(numbers), [4, 5, 6, 7, 8, 20, 21, 43, 44, 45])
self.assertEqual(list(numbers), [])
numbers = parse_ranges("100-1000000000000")
self.assertEqual(next(numbers), 100)
@unittest.expectedFailure
def test_with_individual_numbers(self):
self.assertEqual(
list(parse_ranges("0,4-8,20,43-45")), [0, 4, 5, 6, 7, 8, 20, 43, 44, 45]
)
@unittest.expectedFailure
def test_ignore_arrows(self):
self.assertEqual(
list(parse_ranges("0, 4-8, 20->exit, 43-45")),
[0, 4, 5, 6, 7, 8, 20, 43, 44, 45],
)
if __name__ == "__main__":
unittest.main(verbosity=2)