kAldown

Untitled

Apr 6th, 2017
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.00 KB | None | 0 0
  1. def split_closest_values(numbers):
  2.     """  Shrink closes numbers in a list to max\min separated by the dash ('-')
  3.    split_by_range(list_of_int) -> list of integers, separated by str
  4.  
  5.    Example:
  6.        split_by_range([1, 2, 3, 5, 6, 9]) -> ['1-3', '5-6', '9']
  7.  
  8.    :param numbers: numbers to shrink to
  9.    :type numbers: list[int]
  10.    :return: list of integers as a string, closest ones are separated by the dash ('-'). In asc. sorted order
  11.    :rtype: list[str]
  12.    """
  13.  
  14.     if not numbers:
  15.         return []
  16.  
  17.     result = []
  18.     tmp_last_end_numbers = []
  19.  
  20.     try:
  21.         numbers = sorted(int(numb) for numb in numbers)
  22.     except ValueError as e:
  23.         logging.exception(e)
  24.         return []
  25.  
  26.     # first number must be in result
  27.     last_number = numbers.pop(0)
  28.     tmp_last_end_numbers.append(last_number)
  29.  
  30.     split_flag = False
  31.     for number in numbers:
  32.         if number == last_number:
  33.             continue
  34.         # when following number found -> place flag and continue sequence
  35.         elif number - last_number == 1:
  36.             if not split_flag:
  37.                 split_flag = True
  38.         else:
  39.             # new number is out of following sequence range
  40.             if split_flag:
  41.                 tmp_last_end_numbers.append(last_number)
  42.                 split_flag = False
  43.                 result.append('-'.join([str(x) for x in tmp_last_end_numbers]))
  44.             else:
  45.                 result.append(str(last_number))
  46.  
  47.             # release sequence, and start new buffer with the "breaking" number
  48.             tmp_last_end_numbers = []
  49.             tmp_last_end_numbers.append(number)
  50.  
  51.         # keep in memory prev. number to compare
  52.         last_number = number
  53.  
  54.     # solving problem of a very last number
  55.     # last number must be in result either
  56.     if split_flag:
  57.         tmp_last_end_numbers.append(last_number)
  58.         result.append('-'.join([str(x) for x in tmp_last_end_numbers]))
  59.     else:
  60.         result.append(str(last_number))
  61.  
  62.     return result
Advertisement
Add Comment
Please, Sign In to add comment