Я пришел к следующему решению без создания объекта временного списка, который должен работать с любым повторяемым объектом. Обратите внимание, что эта версия для Python 2.x:
def chunked(iterable, size):
stop = []
it = iter(iterable)
def _next_chunk():
try:
for _ in xrange(size):
yield next(it)
except StopIteration:
stop.append(True)
return
while not stop:
yield _next_chunk()
for it in chunked(xrange(16), 4):
print list(it)
Вывод:
[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]
[12, 13, 14, 15]
[]
Как вы можете видеть, что len (итеративный)% size == 0, тогда у нас есть дополнительный пустой объект итератор. Но я не думаю, что это большая проблема.
Это действительно невероятно сложный формат. разбирать. Вы можете попытаться отделить компонент парсера от медиа-вики (так как это тоже php), но это запутанный беспорядок. Я видел несколько частично автономных, которые выполняют почти разумную работу для очень ограниченного набора разметки.
Если вам случится реализовать один или провести рефакторинг текущей википедии, дайте мне знать, так как это может быть весьма полезно.