parse_ranges: nouvelle solution
This commit is contained in:
parent
51ec5db7bc
commit
9ecfc1addc
|
|
@ -54,4 +54,42 @@ def parse_ranges_v4(range_string):
|
||||||
yield number
|
yield number
|
||||||
|
|
||||||
|
|
||||||
parse_ranges = parse_ranges_v4
|
def parse_ranges_v5(range_string):
|
||||||
|
"""Revisiting the solution after reading Trey's answer.
|
||||||
|
|
||||||
|
The part 'for (begin, _, end) in [subrange.partition("-")]' is tricky as it is here
|
||||||
|
to 'iterate' over the one element list and thus assign the 3-tuple we need inside
|
||||||
|
the comprehension.
|
||||||
|
|
||||||
|
Comprehesion are a way to write for loops and the one we want to write is:
|
||||||
|
ranges = []
|
||||||
|
for subrange in range_string.split(","):
|
||||||
|
begin, _, end = subrange.partition("-")
|
||||||
|
if end.isdecimal():
|
||||||
|
ranges.append(start, end)
|
||||||
|
else:
|
||||||
|
ranges.append(start, start)
|
||||||
|
|
||||||
|
Read more here: https://nedbatchelder.com/blog/201802/a_python_gargoyle.html
|
||||||
|
"""
|
||||||
|
range_string = range_string.replace("->", "-")
|
||||||
|
|
||||||
|
return (
|
||||||
|
number
|
||||||
|
for start, stop in (
|
||||||
|
(begin, end) if end.isdecimal() else (begin, begin)
|
||||||
|
for subrange in range_string.split(",")
|
||||||
|
for (begin, _, end) in [subrange.partition("-")]
|
||||||
|
)
|
||||||
|
for number in range(int(start), int(stop) + 1)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# L'idée principale de la correction est l'expression de générateur :
|
||||||
|
# (EXPRESSION for NOM in ITERABLE) qui permet de rester 'fainéant' de bout en bout !
|
||||||
|
#
|
||||||
|
# Et bien sûr la gargouille for (begin, _, end) in [subrange.partition("-")]
|
||||||
|
# à utiliser avec modération car la lisibilité compte !
|
||||||
|
|
||||||
|
|
||||||
|
parse_ranges = parse_ranges_v5
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue