Представим, вам нужно разбить список (list) на подсписки.
Входные данные:
- список элементов;
- количество получаемых подсписков на выходе.
Важным условием является то, что длины всех получаемых подсписков на выходе должны быть равными или почти равными.
Тоесть, имея список [1, 2, 3, 4, 5] разбивая на 3 части мы желаем получить [[1, 2], [3, 4], [5]].
Или же [1, 2, 3, 4, 5, 6] -> [[1, 2], [3, 4], [5, 6]].
def chunkify_approximately(items, chunks_quantity):
chunk_len = len(items) / chunks_quantity
rest_count = len(items) % chunks_quantity
chunks = []
for i in range(chunks_quantity):
chunk = items[:chunk_len]
items = items[chunk_len:]
if rest_count and items:
chunk.append(items.pop(0))
rest_count -= 1
chunks.append(chunk)
return chunks
Получаем:
>>> chunkify_approximately(range(2), 3) [[0], [1], []] >>> chunkify_approximately(range(8), 3) [[0, 1, 2], [3, 4, 5], [6, 7]] >>> chunkify_approximately(range(12), 5) [[0, 1, 2], [3, 4, 5], [6, 7], [8, 9], [10, 11]]
Или можна сделать, чтобы эта функция возвращала генератор:
def chunkify_approximately_gen(items, chunks_quantity):
chunk_len = len(items) / chunks_quantity
rest_count = len(items) % chunks_quantity
for i in xrange(chunks_quantity):
chunk = items[:chunk_len]
items = items[chunk_len:]
if rest_count and items:
chunk.append(items.pop(0))
rest_count -= 1
yield chunk
No comments:
Post a Comment