Как разбить список на равные подсписки с последним подсписком, составленным из первых возможных элементов списка - PullRequest
0 голосов
/ 25 сентября 2018

Я хочу разбить список на подсписки заданной длины.Если последний блок не имеет заданной длины, он будет дополнен первыми элементами списка.

Приведенная ниже программа Python создает одинаковые подсписки, за исключением последнего блока.

def split_list(the_list, chunk_size):
    result_list = []
    while the_list:
        result_list.append(the_list[:chunk_size])
            the_list = the_list[chunk_size:]

    return result_list

a_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print split_list(a_list, 3)

Вывод:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

Я хочу что-то вроде этого:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2]]

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Проверьте, хотите ли вы быть коротким в последнем чанке списка.Если это так, добавьте необходимое количество элементов, дублирующихся в начале списка.

def split_list(the_list, chunk_size):
    result_list = []
    short = len(the_list) % chunk_size
    if short:
        # Add wrap-around elements from front of the_list
        the_list.extend(the_list[:chunk_size-short])

    while the_list:
        result_list.append(the_list[:chunk_size])
        the_list = the_list[chunk_size:]

    return result_list

a_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print(split_list(a_list, 3))

Вывод:

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2]]
0 голосов
/ 25 сентября 2018

Один из способов - использовать понимание списка, а затем добавить часть начала списка в последнюю группу, если необходимо.

def split_list(the_list, chunk_size):
    chunks = [the_list[i:i+chunk_size] for i in range(0, len(the_list), chunk_size)]
    chunks[-1] += the_list[:(chunk_size - len(the_list)) % chunk_size]
    return chunks
0 голосов
/ 25 сентября 2018

Давайте попробуем решение на основе генератора с использованием itertools.cycle и islice:

from itertools import cycle, islice         
def split_list(lst, n):    
     it = cycle(lst)
     for i in range(len(lst) // n + len(lst) % n):
         yield list(islice(it, n))

Вызовите функцию следующим образом:

>>> a_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(split_list(a_list, 3))
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 1, 2]]

Я лично предпочитаю генератор здесь, потому чтокуски получаются по одному, эффективно.Если вы хотите все сразу, вы звоните list() о результате (как я сделал).

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