Разрезание списка в список подсписков [дубликат]

Этот вопрос уже имеет ответ здесь:

Каков самый простой и довольно эффективный способ нарезать список в список нарезанных разделов подсписка для произвольной длины sub списки?

Например, если наш исходный список:

input = [1, 2, 3, 4, 5, 6, 7, 8, 9, ... ]

И наша длина списка sub равняется 3 затем, мы ищем:

output = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ... ]

Аналогично, если наша длина списка sub равняется 4 затем, мы ищем:

output = [ [1, 2, 3, 4], [5, 6, 7, 8], ... ]
32
задан Peter Mortensen 23 May 2018 в 18:15
поделиться

3 ответа

[input[i:i+n] for i in range(0, len(input), n)]        # Use xrange in py2k

где n - длина блока.

Поскольку вы не определяете, что может случиться с последним элементом нового списка, когда количество элементов во входном вводе не делится на n , я предположил, что это не важно: при этом последний элемент будет равен 2, например, если n равно 7.

75
ответ дан 27 November 2019 в 19:56
поделиться

В документации модуля itertools содержится следующий рецепт :

import itertools

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return itertools.izip_longest(fillvalue=fillvalue, *args)

Эта функция возвращает итератор кортежи желаемой длины:

>>> list(grouper(2, [1,2,3,4,5,6,7]))
[(1, 2), (3, 4), (5, 6), (7, None)]
14
ответ дан 27 November 2019 в 19:56
поделиться

Мне нравится решение SilentGhost.

В моем решении используется функциональное программирование на Python:

group = lambda t, n: zip(*[t[i::n] for i in range(n)])
group([1, 2, 3, 4], 2)

дает:

[(1, 2), (3, 4)]

Это предполагает, что размер входного списка делится на размер группы. В противном случае непарные элементы не будут включены.

0
ответ дан 27 November 2019 в 19:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: