Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def split_closest_values(numbers):
- """ Shrink closes numbers in a list to max\min separated by the dash ('-')
- split_by_range(list_of_int) -> list of integers, separated by str
- Example:
- split_by_range([1, 2, 3, 5, 6, 9]) -> ['1-3', '5-6', '9']
- :param numbers: numbers to shrink to
- :type numbers: list[int]
- :return: list of integers as a string, closest ones are separated by the dash ('-'). In asc. sorted order
- :rtype: list[str]
- """
- if not numbers:
- return []
- result = []
- tmp_last_end_numbers = []
- try:
- numbers = sorted(int(numb) for numb in numbers)
- except ValueError as e:
- logging.exception(e)
- return []
- # first number must be in result
- last_number = numbers.pop(0)
- tmp_last_end_numbers.append(last_number)
- split_flag = False
- for number in numbers:
- if number == last_number:
- continue
- # when following number found -> place flag and continue sequence
- elif number - last_number == 1:
- if not split_flag:
- split_flag = True
- else:
- # new number is out of following sequence range
- if split_flag:
- tmp_last_end_numbers.append(last_number)
- split_flag = False
- result.append('-'.join([str(x) for x in tmp_last_end_numbers]))
- else:
- result.append(str(last_number))
- # release sequence, and start new buffer with the "breaking" number
- tmp_last_end_numbers = []
- tmp_last_end_numbers.append(number)
- # keep in memory prev. number to compare
- last_number = number
- # solving problem of a very last number
- # last number must be in result either
- if split_flag:
- tmp_last_end_numbers.append(last_number)
- result.append('-'.join([str(x) for x in tmp_last_end_numbers]))
- else:
- result.append(str(last_number))
- return result
Advertisement
Add Comment
Please, Sign In to add comment