Вот быстрая однострочная версия. Как и у Хаскелла, он ленивый.
from itertools import islice, takewhile, repeat
split_every = (lambda n, it:
takewhile(bool, (list(islice(it, n)) for _ in repeat(None))))
Для этого необходимо использовать iter
до вызова split_every
.
Пример:
list(split_every(5, iter(xrange(9))))
[[0, 1, 2, 3, 4], [5, 6, 7, 8]]
Хотя это и не одна строка, в приведенной ниже версии не требуется, чтобы вы называли iter
, что может быть распространенной ошибкой.
from itertools import islice, takewhile, repeat
def split_every(n, iterable):
"""
Slice an iterable into chunks of n elements
:type n: int
:type iterable: Iterable
:rtype: Iterator
"""
iterator = iter(iterable)
return takewhile(bool, (list(islice(iterator, n)) for _ in repeat(None)))
(Спасибо @ eli-korvigo за улучшения.)
Динамические массивы значительно медленнее, чем массивы в стиле C в DOORS, поэтому вам следует избегать их, если вы заранее знаете размер массива.
Если вы знаете количество элементов, но вам нужно больше размеры, вы можете сделать это так:
//Define an array of (for example) bool
int imax=5
int jmax=7
bool myarray[imax*jmax]
//Access for example element myarray[3][2]
int i=3
int j=2
bool mybool=myarray[i*jmax+j]