Кусок списка с центрированием # 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]