Last active
June 15, 2021 09:34
-
-
Save raczben/76cd1229504d82115e6427e00cf4742c to your computer and use it in GitHub Desktop.
Convert string represented numbers, list and range of numbers to python structures
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Number, list range util | |
def number(a, just_try=False): | |
""" | |
Parse any representation of number from string. | |
:param a: String represented number | |
:type a: Union[str, int, float] | |
:param just_try: True: Return :a: if it is not a number, defaults to False | |
:type just_try: bool, optional | |
:return: Integer or float number | |
:rtype: Union[int, float] | |
""" | |
try: | |
# First, we try to convert to integer. | |
# (Note, that all integer can be interpreted as float and hex number.) | |
return int(a) | |
except Exception: | |
# The integer convertion has failed because `a` contains others than digits [0-9]. | |
# Next try float, because the normal form (eg: 1E3 = 1000) can be converted to hex also. | |
# But if we need hex we will write 0x1E3 (= 483) starting with 0x | |
try: | |
return float(a) | |
except Exception: | |
try: | |
return int(a, 16) | |
except Exception: | |
if just_try: | |
return a | |
else: | |
raise | |
def str2numlist(s): | |
""" | |
Convert a string parameter to iterable object. | |
- Simple integer, like '42' or '0x201', will be returned as a list containing the given value. | |
- Range: two integers separated by a colon: like '10:15'. This will return [10,11,12,13,14,15] | |
- Specific values separated by coma: '1,2,5,6'. This will return [1,2,5,6] | |
:param s: String represented list of range of integers or numbers | |
:type s: str | |
:return: List of integers | |
:rtype: List[int] | |
""" | |
return [y for x in s.split(',') for y in str_ranges_to_list(x) ] | |
def str_ranges_to_list(s): | |
""" | |
Convert a string parameter to iterable object. | |
:param s: String represented range of integers | |
:type s: str | |
:return: List of integers | |
:rtype: List[int] | |
""" | |
s = s.strip() | |
try: | |
begin,end=s.split(':') | |
return range(number(begin), number(end)) | |
except ValueError: # not enough values to unpack | |
return [number(s)] | |
def intersperse(seq, value): | |
""" | |
From: | |
https://stackoverflow.com/a/6300649/2506522 | |
:param seq: List to be intersperse | |
:type seq: List | |
:param value: The element to be inserted between each element | |
:type value: Any | |
:return: intersperse List | |
:rtype: List | |
""" | |
res = [value] * (2 * len(seq) - 1) | |
res[::2] = seq | |
return res | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment