2009-04-15 5 views

ответ

125
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) 
+52

Вы должны заставить Int разделения в Python 3. // требуется. –

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

return (B,C) 

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

11

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

+0

Я думаю, что вы забыли разделить на 2 шага. :) –

+0

Да, я сделал. Отредактировано через две секунды после публикации ... –

+1

точки за то, что они были одним лайнером – JustGage

2

Использование list slicing. Синтаксис в основном 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 ...

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

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

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

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

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) 
+2

Если список не делится равномерно (например, split_list ([1,2,3], 2)), это фактически вернет wanted_parts + 1 список. – Brian

+0

Правильно, я сомневался, что должен быть правильный подход (у вас есть еще одна часть или у последнего списка есть еще один предмет). Я буду обновлять свой пост, спасибо за комментирование. – ChristopheD

+0

На самом деле это все равно не будет работать: у вас может быть остаток> 1. split_list (range (5), 3) даст 5 списков с указанным выше кодом. Работа с этими случаями также сложнее, так как вам нужно распределить список равномерно (например, для 19-ти элементов списка на 10 частей, вам не нужен элемент 9 * 1 и один с 9.) – Brian

2

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

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

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

+0

Это отлично работает в моей ситуации, однако оно добавляет каждый другой последний индекс каждого списка в собственный список. Сложно объяснить. Пожалуйста, ответьте, если вы можете помочь, и я объясню больше. –

3

Существует официальная receipe 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 doc page.

7

Если вы не заботитесь о заказе ...

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

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

+1

Тщательно назовите arg 'list', затеняя' list (...) 'встроенный. Я обычно видел 'lst' и' list_', чтобы избежать этого. –

+0

Это чувствует себя наиболее pythonic (игнорируя неправильное название) – Tjorriemorrie

9

Здесь общее решение, разделить на обр части графа

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

С подсказками из @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) 
14
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]] 
+3

Я действительно оценил способ отформатировать этот ответ как «function» + «test» + «result»! – starlocke

+1

также полезно преобразовать список в матрицу – mpgn

+0

Это работает, но не совсем. Я использую эту функцию в цикле, и длины меняются. Другими словами: 'для i, j в zip (list, lengths): print (split (i, j))'. Списки 'list' и' lengths имеют одинаковую длину. j чередуется: 5,4,5,4,5, а функция split работает на первых двух чередованиях, т.е. разбивает первый «i» списка на 5 и 4, НО на следующей итерации он разбивает его на 4 , 4,1. : \ Пожалуйста, ответьте, если вы хотите, чтобы я объяснил больше (напишите новый вопрос) –

0

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

# 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:] 
Смежные вопросы