Разделить список на более мелкие списки (разделить пополам)

Я ищу способ легко разбить список python пополам.

Итак, если у меня есть массив:

A = [0,1,2,3,4,5]

Я мог бы получить:

B = [0,1,2]

C = [3,4,5]

Ответ 1

A = [1,2,3,4,5,6]
B = A[:len(A)//2]
C = A[len(A)//2:]

Если вы хотите функцию:

def split_list(a_list):
    half = len(a_list)//2
    return a_list[:half], a_list[half:]

A = [1,2,3,4,5,6]
B, C = split_list(A)

Ответ 2

Несколько более общее решение (вы можете указать количество частей, которые хотите, а не просто разделять "пополам" ):

EDIT: обновленная запись для обработки нечетных длин списка

EDIT2: обновить сообщение снова на основе информационных комментариев Brians

def split_list(alist, wanted_parts=1):
    length = len(alist)
    return [ alist[i*length // wanted_parts: (i+1)*length // wanted_parts] 
             for i in range(wanted_parts) ]

A = [0,1,2,3,4,5,6,7,8,9]

print split_list(A, wanted_parts=1)
print split_list(A, wanted_parts=2)
print split_list(A, wanted_parts=8)

Ответ 3

f = lambda A, n=3: [A[i:i+n] for i in range(0, len(A), n)]
f(A)

n - предопределенная длина массивов результатов

Ответ 4

def split(arr, size):
     arrs = []
     while len(arr) > size:
         pice = arr[:size]
         arrs.append(pice)
         arr   = arr[size:]
     arrs.append(arr)
     return arrs

Тест:

x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
print(split(x, 5))

результат:

[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13]]

Ответ 5

B,C=A[:len(A)/2],A[len(A)/2:]

Ответ 6

Вот общее решение, разделите arr на счетную часть

def split(arr, count):
     return [arr[i::count] for i in range(count)]

Ответ 7

Если вам не нужен порядок...

def split(list):  
    return list[::2], list[1::2]

list[::2] получает каждый второй элемент в списке, начиная с 0-го элемента.
list[1::2] получает каждый второй элемент в списке, начиная с 1-го элемента.

Ответ 8

def splitter(A):
    B = A[0:len(A)//2]
    C = A[len(A)//2:]

 return (B,C)

Я тестировал, и двойная косая черта требуется, чтобы заставить int деление в python 3. Мой исходный пост был прав, хотя wysiwyg сломался в Opera по какой-то причине.

Ответ 9

Существует официальный рецепт Python для более обобщенного случая разбиения массива на меньшие массивы размера n.

from itertools import izip_longest
def grouper(n, iterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

Этот фрагмент кода взят со страницы документации Python itertools.

Ответ 10

Использование списка нарезки. Синтаксис в основном my_list[start_index:end_index]

>>> i = [0,1,2,3,4,5]
>>> i[:3] # same as i[0:3] - grabs from first to third index (0->2)
[0, 1, 2]
>>> i[3:] # same as i[3:len(i)] - grabs from fourth index to end
[3, 4, 5]

Чтобы получить первую половину списка, вы переходите от первого индекса к len(i)//2 (где // - целочисленное деление - так что 3//2 will give the floored result of 1 , instead of the invalid list index of 1,5 '):

>>> i[:len(i)//2]
[0, 1, 2]

... и поменяйте местами значения, чтобы получить вторую половину:

>>> i[len(i)//2:]
[3, 4, 5]

Ответ 11

В то время как ответы выше более или менее правильны, вы можете столкнуться с проблемами, если размер вашего массива не делится на 2, так как результат a / 2, являющийся нечетным, является float в python 3.0, и в более ранней версии, если вы укажете from __future__ import division в начале вашего script. В любом случае вам лучше перейти на целочисленное деление, т.е. a // 2, чтобы получить "передовую" совместимость вашего кода.

Ответ 12

Если у вас большой список, лучше использовать itertools и написать функцию для выдачи каждой части по мере необходимости:

from itertools import islice

def make_chunks(data, SIZE):
    it = iter(data)
    # use 'xragne' if you are in python 2.7:
    for i in range(0, len(data), SIZE):
        yield [k for k in islice(it, SIZE)]

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

A = [0, 1, 2, 3, 4, 5, 6]

size = len(A) // 2

for sample in make_chunks(A, size):
    print(sample)

Выход:

[0, 1, 2]
[3, 4, 5]
[6]

Благодаря @thefourtheye и @Bede Constantinides

Ответ 13

10 лет спустя.. я подумала - почему бы не добавить еще

arr = 'Some random string' * 10; n = 4
print([arr[e:e+n] for e in range(0,len(arr),n)])

Ответ 14

С подсказками от @ChristopheD

def line_split(N, K=1):
    length = len(N)
    return [N[i*length/K:(i+1)*length/K] for i in range(K)]

A = [0,1,2,3,4,5,6,7,8,9]
print line_split(A,1)
print line_split(A,2)

Ответ 15

Это похоже на другие решения, но немного быстрее.

# Usage: split_half([1,2,3,4,5]) Result: ([1, 2], [3, 4, 5])

def split_half(a):
    half = len(a) >> 1
    return a[:half], a[half:]

Ответ 16

#for python 3
    A = [0,1,2,3,4,5]
    l = len(A)/2
    B = A[:int(l)]
    C = A[int(l):]