May 5, 2014

Разделение списка в Python на примерно равные части

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