Разделите список Python каждого n-элемента - PullRequest
0 голосов
/ 19 апреля 2020

Недавно я нашел код для разработки набора списков из списка, этот код был написан пользователем Mai , отвечающим на вопрос , но я еще не понял его , Может ли кто-нибудь помочь мне понять это? И ... есть ли способ переписать этот код, который будет проще? Код:

def even_divide(lst, num_piece=4):
    return [
        [lst[i] for i in range(len(lst)) if (i % num_piece) == r]
        for r in range(num_piece)
    ]

Спасибо!

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Это довольно просто на самом деле. Просто просмотрите значения двух циклов:

Начиная с внешнего 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)]
0 голосов
/ 19 апреля 2020

Может ли кто-нибудь помочь мне понять это?

Конечно! Это понимание списка. Понимание списка берет список и что-то делает с каждым элементом в этом списке. Допустим, я хочу умножить каждый элемент в моем списке на 2:

new_list = [element*2 for element in my_list]

Что делает его понятным для списка - это синтаксис скобок. Для новичков это обычно та часть, к которой нужно привыкнуть. С учетом сказанного я предполагаю, что именно это затрудняет понимание кода в вашем вопросе, поскольку у вас есть понимание списка в понимании списка. Сейчас это может быть трудно понять, но понимание списка - замечательная вещь в python.

Но, как упоминает этот пост , существует много дискуссий по поводу понимания списка, лямбда-выражений, отображать, уменьшать и фильтровать. В конечном счете, вам решать, что лучше для вашего проекта. Я не поклонник всего остального, кроме списочных представлений, поэтому я использую их религиозно.

Основываясь на вопросе, который вы связали, понимание списка принимает 1-й список длины x и превращает его в 2-й. список (длина х, ширина у). Это как numpy .reshape .

И ... есть ли способ переписать этот код, чтобы он стал проще?

Я бы не рекомендовал это. Понимания списков считаются очень pythoni c, и вы увидите их повсюду. Лучше всего их использовать и привыкнуть к ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...