Разбиение списка на N частей примерно равной длины - PullRequest
119 голосов
/ 25 января 2010

Каков наилучший способ разбить список на примерно равные части? Например, если список состоит из 7 элементов и разделен на 2 части, мы хотим получить 3 элемента в одной части, а в другой - 4 элемента.

Я ищу что-то вроде even_split(L, n), которое разбивает L на n части.

def chunks(L, n):
    """ Yield successive n-sized chunks from L.
    """
    for i in xrange(0, len(L), n):
        yield L[i:i+n]

Приведенный выше код дает 3 порции, а не 3 порции. Я мог бы просто транспонировать (перебрать это и взять первый элемент каждого столбца, вызвать эту часть первую, затем взять второй и поместить его во вторую часть и т. Д.), Но это разрушает порядок элементов.

Ответы [ 23 ]

0 голосов
/ 20 июля 2016

Округление linspace и использование его в качестве индекса - более простое решение, чем предлагает amit12690.

function chunks=chunkit(array,num)

index = round(linspace(0,size(array,2),num+1));

chunks = cell(1,num);

for x = 1:num
chunks{x} = array(:,index(x)+1:index(x+1));
end
end
0 голосов
/ 13 июня 2014

То же, что и ответ задания , но учитываются списки с размером, меньшим, чем количество чанков.

def chunkify(lst,n):
    [ lst[i::n] for i in xrange(n if n < len(lst) else len(lst)) ]

если n (количество чанков) равно 7, а lst (список для разделения) равен [1, 2, 3], чанки [[0], [1], [2]] вместо [[0] , [1], [2], [], [], [], []]

0 голосов
/ 18 февраля 2015

Вы также можете использовать:

split=lambda x,n: x if not x else [x[:n]]+[split([] if not -(len(x)-n) else x[-(len(x)-n):],n)][0]

split([1,2,3,4,5,6,7,8,9],2)

[[1, 2], [3, 4], [5, 6], [7, 8], [9]]
...