I have a string that I want to convert to an array in python. The string has a few possible formats:
Xstart(xstep)Xend,X2
.Xstart(xstep)Xend
X1,X2,X3
X1
For example:
6(6)24
should give me [6,12,18,24].6(6)24,48
should give me [6,12,18,24,48]6,24,42,50
should give me [6,24,42,50]6
should give me [6]
CodePudding user response:
A naive solution without using a regex could be to just split on ','
and then look for the presence of an opening parenthesis indicating the presence of a step
:
from prettytable import PrettyTable
from typing import NamedTuple
def str_to_extracted_list(s: str) -> list[int]:
extracted_list = []
s_parts = s.split(',')
for part in s_parts:
if '(' in part:
opening_pos = part.find('(')
ending_pos = part.find(')')
start = int(part[:opening_pos])
step = int(part[part.find('(') 1:part.find(')')])
end = int(part[ending_pos 1:])
x = start
while x <= end:
extracted_list.append(int(x))
x = step
else:
extracted_list.append(int(part))
return extracted_list
class TestCase(NamedTuple):
s: str
expected: list[int]
def main() -> None:
t = PrettyTable(['s', 'expected', 'actual'])
t.align = 'l'
for s, expected in [TestCase(s='6(6)24', expected=[6, 12, 18, 24]),
TestCase(s='6(6)24,48', expected=[6, 12, 18, 24, 48]),
TestCase(s='6,24,42,50', expected=[6, 24, 42, 50]),
TestCase(s='6', expected=[6])]:
t.add_row([s, expected, str_to_extracted_list(s)])
print(t)
if __name__ == '__main__':
main()
Output:
------------ --------------------- ---------------------
| s | expected | actual |
------------ --------------------- ---------------------
| 6(6)24 | [6, 12, 18, 24] | [6, 12, 18, 24] |
| 6(6)24,48 | [6, 12, 18, 24, 48] | [6, 12, 18, 24, 48] |
| 6,24,42,50 | [6, 24, 42, 50] | [6, 24, 42, 50] |
| 6 | [6] | [6] |
------------ --------------------- ---------------------