Это довольно просто на самом деле. Просто просмотрите значения двух циклов:
Начиная с внешнего l oop, r
будет 0
, затем 1
, затем 2
, et c. Давайте посмотрим на случай, для которого r == 1
. При запуске через различные значения i
, (которые будут 0, 1, 2, ... len(lst)
, значение i % 4
, означающее остаток от деления i
на 4
, будет 0, 1, 2, 3, 0, 1, 2, 3, ...
. Таким образом, i % 4
будет равно r
, для каждых 4 значений i
!
Для нашего выбранного r == 1
это будет означать, что мы выбираем lst[1], lst[5], lst[9], ...
, et c.
А для r == 2
? Вы уже догадались! Вы бы подобрали lst[2], lst[6], lst[10],...
.
Итак, всего вы получите 4 списка, с неперекрывающимися элементами исходного списка, просто «перепрыгивая» 4 элемента каждый раз, но начиная с разных значений.
Что, естественно, приводит к более простому решению:
def even_divide(lst, num_piece=4):
return [lst[r::num_piece] for r in range(num_piece)]