Этот вопрос уже имеет ответ здесь:
Каков самый простой и довольно эффективный способ нарезать список в список нарезанных разделов подсписка для произвольной длины 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], ... ]
[input[i:i+n] for i in range(0, len(input), n)] # Use xrange in py2k
где n
- длина блока.
Поскольку вы не определяете, что может случиться с последним элементом нового списка, когда количество элементов во входном вводе
не делится на n
, я предположил, что это не важно: при этом последний элемент будет равен 2, например, если n
равно 7.
В документации модуля 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)]
Мне нравится решение 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)]
Это предполагает, что размер входного списка делится на размер группы. В противном случае непарные элементы не будут включены.