Кусок списка с центрированием # Get center slice from list # get_center_slice

Иногда нужно сделать хитрую “вырезку” из списка: определенной длинны, плюс так, чтобы выбранный элемент оказался бы в центре “вырезки”. Чтобы это работало всегда и безотказно, нужно учесть случаи, когда элемент близко к началу или к концу списка. А так же, требуемая длина вырезки может быть больше длины списка.

Типичный пример использования - красивый такой paginator, у которого текущая страница всегда в центре списка страниц.

Когда я встретил такую задачу, то использовал простое “лобовое” решение. Все отлично сработало :) Над усовершенствованием можно будет подумать в следующий раз, если такая задача попадется снова.

Вот оно:

def get_center_slice(full_list, slice_size, selected):
    """
    Обрезать список по указанной длине, чтобы выбранный
    элемент оказался в центре списка.
    """
    list_len = len(full_list)
    slice_next = slice_size/2
    slice_prev = slice_size - slice_next
    
    start_index = selected - slice_prev + 1
    end_offset = 0
    if start_index  list_len:
        start_index = max(0, start_index - end_index + list_len)
        end_index = list_len
    
    return full_list[start_index:end_index]

Notes

  1. rudyryk posted this