Skip to content

Instantly share code, notes, and snippets.

@raczben
Last active June 15, 2021 09:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save raczben/76cd1229504d82115e6427e00cf4742c to your computer and use it in GitHub Desktop.
Save raczben/76cd1229504d82115e6427e00cf4742c to your computer and use it in GitHub Desktop.
Convert string represented numbers, list and range of numbers to python structures
# 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