Я ищу способ легко разбить список python пополам.Разделить список на более мелкие списки
Так что, если у меня есть массив:
A = [0,1,2,3,4,5]
я смог бы получить:
B = [0,1,2]
C = [3,4,5]
Я ищу способ легко разбить список python пополам.Разделить список на более мелкие списки
Так что, если у меня есть массив:
A = [0,1,2,3,4,5]
я смог бы получить:
B = [0,1,2]
C = [3,4,5]
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)
def splitter(A):
B = A[0:len(A)//2]
C = A[len(A)//2:]
return (B,C)
я тестировал, и двойной слэш требуется, чтобы заставить Int разделения в python 3. Мой исходный пост был прав, хотя wysiwyg сломался в Opera по какой-то причине.
B,C=A[:len(A)/2],A[len(A)/2:]
Я думаю, что вы забыли разделить на 2 шага. :) –
Да, я сделал. Отредактировано через две секунды после публикации ... –
точки за то, что они были одним лайнером – JustGage
Использование 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]
чуть более общее решение (вы можете указать количество деталей, которые вы хотите, а не только разбиваться пополам '):
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)
Если список не делится равномерно (например, split_list ([1,2,3], 2)), это фактически вернет wanted_parts + 1 список. – Brian
Правильно, я сомневался, что должен быть правильный подход (у вас есть еще одна часть или у последнего списка есть еще один предмет). Я буду обновлять свой пост, спасибо за комментирование. – ChristopheD
На самом деле это все равно не будет работать: у вас может быть остаток> 1. split_list (range (5), 3) даст 5 списков с указанным выше кодом. Работа с этими случаями также сложнее, так как вам нужно распределить список равномерно (например, для 19-ти элементов списка на 10 частей, вам не нужен элемент 9 * 1 и один с 9.) – Brian
Хотя ответы выше более или менее правильно, вы можете возникают проблемы, если размер вашего массива не делится на 2, поскольку результат a/2
, являющийся нечетным, является float в python 3.0, а в более ранней версии, если вы укажете from __future__ import division
в начале вашего скрипта. Вы в любом случае лучше предпочитаете целое деление, то есть a // 2
, чтобы получить «передовую» совместимость вашего кода.
f = lambda A, n=3: [A[i:i+n] for i in range(0, len(A), n)]
f(A)
n
- предопределенная длина результата массивов
Это отлично работает в моей ситуации, однако оно добавляет каждый другой последний индекс каждого списка в собственный список. Сложно объяснить. Пожалуйста, ответьте, если вы можете помочь, и я объясню больше. –
Существует официальная 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.
Если вы не заботитесь о заказе ...
def split(list):
return list[::2], list[1::2]
list[::2]
получает каждый второй элемент в списке, начиная с 0-го элемента.
list[1::2]
получает каждый второй элемент в списке, начиная с 1-го элемента.
Тщательно назовите arg 'list', затеняя' list (...) 'встроенный. Я обычно видел 'lst' и' list_', чтобы избежать этого. –
Это чувствует себя наиболее pythonic (игнорируя неправильное название) – Tjorriemorrie
Здесь общее решение, разделить на обр части графа
def split(arr, count):
return [arr[i::count] for i in range(count)]
С подсказками из @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)
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]]
Я действительно оценил способ отформатировать этот ответ как «function» + «test» + «result»! – starlocke
также полезно преобразовать список в матрицу – mpgn
Это работает, но не совсем. Я использую эту функцию в цикле, и длины меняются. Другими словами: 'для i, j в zip (list, lengths): print (split (i, j))'. Списки 'list' и' lengths имеют одинаковую длину. j чередуется: 5,4,5,4,5, а функция split работает на первых двух чередованиях, т.е. разбивает первый «i» списка на 5 и 4, НО на следующей итерации он разбивает его на 4 , 4,1. : \ Пожалуйста, ответьте, если вы хотите, чтобы я объяснил больше (напишите новый вопрос) –
Это похоже на другие решения, но немного быстрее.
# 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:]
#for python 3
A = [0,1,2,3,4,5]
l = len(A)/2
B = A[:int(l)]
C = A[int(l):]
Вы должны заставить Int разделения в Python 3. // требуется. –