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