Представим, вам нужно разбить список (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