Source code for MEDiml.utils.parse_contour_string

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from typing import List, Tuple, Union

import numpy as np

from ..utils.strfind import strfind


[docs] def parse_contour_string(contour_string) -> Union[Tuple[float, List[str]], Tuple[int, List[str]], Tuple[List[int], List[str]]]: """Finds the delimeters (:math:`'+'` and :math:`'-'`) and the contour indexe(s) from the given string. Args: contour_string (str, float or int): Index or string of indexes with delimeters. For example: :math:`'3'` or :math:`'1-3+2'`. Returns: float, int: If ``contour_string`` is a an int or float we return ``contour_string``. List[str]: List of the delimeters. List[int]: List of the contour indexes. Example: >>> ``contour_string`` = '1-3+2' >>> :function: parse_contour_string(contour_string) [1, 2, 3], ['+', '-'] >>> ``contour_string`` = 1 >>> :function: parse_contour_string(contour_string) 1, [] """ if isinstance(contour_string, (int, float)): return contour_string, [] ind_plus = strfind(string=contour_string, pattern='\+') ind_minus = strfind(string=contour_string, pattern='\-') ind_operations = np.sort(np.hstack((ind_plus, ind_minus))).astype(int) # Parsing operations and contour numbers # AZ: I assume that contour_number is an integer if ind_operations.size == 0: operations = [] contour_number = [int(contour_string)] else: n_op = len(ind_operations) operations = [contour_string[ind_operations[i]] for i in np.arange(n_op)] contour_number = np.zeros(n_op + 1, dtype=int) contour_number[0] = int(contour_string[0:ind_operations[0]]) for c in np.arange(start=1, stop=n_op): contour_number[c] = int(contour_string[(ind_operations[c-1]+1) : ind_operations[c]]) contour_number[-1] = int(contour_string[(ind_operations[-1]+1):]) contour_number.tolist() return contour_number, operations