Я ищу способ легко разделить список питонов пополам.
Так что если у меня есть массив:
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)
B = A[:(len(A) // 10) * 8]
C = A[(len(A) // 10) * 8:]
Несколько более общее решение (вы можете указать количество частей, которые вы хотите, а не просто разделить пополам):
РЕДАКТИРОВАТЬ : обновленный пост для обработки нечетных длин списка
РЕДАКТИРОВАТЬ 2 : обновить пост снова на основе информативных комментариев Brians
источник
//
означает целочисленное деление. Их не следует упускать из виду, поскольку они очень важны для выполнения этой работы.n
- предопределенная длина массивов результатовисточник
Тест:
результат:
источник
for i,j in zip(list,lengths): print(split(i,j))
.list
Иlengths
списки имеют одинаковую длину. j чередуется: 5,4,5,4,5, и функция split работает на первых двух чередованиях, то есть разделяет первыйi
список на 5 и 4, НО на следующей итерации разделяет его на 4,4, 1. : \ Пожалуйста, ответьте, если вы хотите, чтобы я объяснил больше (отправьте новый вопрос)Если вы не заботитесь о заказе ...
list[::2]
получает каждый второй элемент в списке, начиная с 0-го элемента.list[1::2]
получает каждый второй элемент в списке, начиная с 1-го элемента.источник
list
с затенениемlist(...)
встроенного. Я виделlst
иlist_
использовал обычно, чтобы избежать этого.B,C=A[:len(A)/2],A[len(A)/2:]
источник
Вот общее решение, разделить arr на счетную часть
источник
Я проверил, и двойная косая черта требуется для принудительного деления int в Python 3. Мой оригинальный пост был правильным, хотя wysiwyg сломался в Opera, по некоторым причинам.
источник
Существует официальный рецепт Python для более обобщенного случая разбиения массива на меньшие по размеру массивы
n
.Этот фрагмент кода взят со страницы документации Python itertools .
источник
Использование списка нарезки . Синтаксис в основном
my_list[start_index:end_index]
Чтобы получить первую половину списка, вы срезаете с первого индекса на
len(i)//2
(где//
целочисленное деление - так3//2 will give the floored result of
1, instead of the invalid list index of
1,5`):... и поменяйте местами значения, чтобы получить вторую половину:
источник
3//2
дает1
, а затем вы получаете то,i[:1]
что дает,[0]
аi[1:]
что дает[1, 2]
Если у вас большой список, лучше использовать itertools и написать функцию для вывода каждой части по мере необходимости:
Вы можете использовать это как:
Выход:
Благодаря @thefourtheye и @Bede Constantinides
источник
10 лет спустя .. я подумала - почему бы не добавить еще
источник
Хотя приведенные выше ответы более или менее правильны, вы можете столкнуться с проблемами, если размер вашего массива не делится на 2, в результате чего
a / 2
, будучи нечетным, это число с плавающей точкой в Python 3.0, и в более ранней версии, если вы укажитеfrom __future__ import division
в начале вашего сценария. В любом случае вам лучше пойти на целочисленное деление, т. Е.a // 2
Чтобы получить «прямую» совместимость вашего кода.источник
Это похоже на другие решения, но немного быстрее.
источник
С подсказками от @ChristopheD
источник
источник
Еще один взгляд на эту проблему в 2020 году ... Вот обобщение проблемы. Я интерпретирую «разделить список пополам» как… (т.е. только два списка, и не должно быть никакого распространения на третий массив в случае нечетного выхода и т. Д.). Например, если длина массива равна 19, а деление на два с помощью оператора // дает 9, и в итоге мы получим два массива длиной 9 и один массив (третий) длины 1 (то есть всего три массива). Если мы хотим, чтобы общее решение давало два массива все время, я предполагаю, что мы довольны получающимися массивами дуэтов, которые не равны по длине (один будет длиннее другого). И что предполагается, что все в порядке, чтобы смешать порядок (чередуя в этом случае).
Эта концепция работает для любого количества разделов списка по вашему желанию (вам придется настроить код в зависимости от того, сколько частей списка вы хотите). И довольно просто интерпретировать. Чтобы ускорить процесс, вы даже можете написать этот цикл в cython / C / C ++, чтобы ускорить процесс. Опять же, я попробовал этот код в сравнительно небольших списках ~ 10000 строк, и он заканчивается за доли секунды.
Просто мои два цента.
Спасибо!
источник