parse_ranges: first attempt with Bonus1.
This commit is contained in:
parent
7ac0068aa2
commit
b1e27e7699
19
parse_ranges/parse_ranges.py
Normal file
19
parse_ranges/parse_ranges.py
Normal 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
|
||||||
42
parse_ranges/test_parse_ranges.py
Normal file
42
parse_ranges/test_parse_ranges.py
Normal 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)
|
||||||
Loading…
Reference in a new issue