Я шукаю спосіб легко розділити список пітонів навпіл.
Так що якщо у мене є масив:
A = [0,1,2,3,4,5]
Я міг би отримати:
B = [0,1,2]
C = [3,4,5]
Я шукаю спосіб легко розділити список пітонів навпіл.
Так що якщо у мене є масив:
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:]
Трохи більш загальне рішення (ви можете вказати кількість потрібних деталей, а не просто розділити "навпіл"):
РЕДАКТУВАННЯ : оновлена публікація, щоб обробити незвичайні довжини списку
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)
//
означає ціле ділення. Вони не повинні залишатися осторонь, оскільки вони є досить важливими для створення цієї роботи.
f = lambda A, n=3: [A[i:i+n] for i in range(0, len(A), n)]
f(A)
n
- заздалегідь визначена довжина масивів результатів
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]]
for i,j in zip(list,lengths): print(split(i,j))
. list
І lengths
списки мають однакову довжину. j чергується: 5,4,5,4,5, і функція розбиття працює на перших двох чергуваннях, тобто розбиває перший i
список на 5 і 4, АЛЕ при наступній ітерації він розбиває його на 4,4, 1. : \ Будь ласка, дайте відповідь, якщо ви хочете, щоб я пояснив більше (опублікуйте нове запитання)
Якщо ви не дбаєте про замовлення ...
def split(list):
return list[::2], list[1::2]
list[::2]
отримує кожен другий елемент у списку, починаючи з 0-го елемента.
list[1::2]
отримує кожен другий елемент у списку, починаючи з 1-го елемента.
list
затіненням list(...)
вбудованого. Я бачив lst
і list_
використовував, щоб уникнути цього.
def splitter(A):
B = A[0:len(A)//2]
C = A[len(A)//2:]
return (B,C)
Я перевірив, і подвійний косий рядок потрібен для того, щоб примусити розділити Int на python 3. Первісний пост був правильним, хоча Wysiwyg чомусь зламався в Opera.
Існує офіційний прийом 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" .
Використання нарізки списку . Синтаксис в основному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]
3//2
дає 1
, то ви отримаєте , i[:1]
який дає вам [0]
і і i[1:]
що дає[1, 2]
Якщо у вас великий список, краще використовувати 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
Хоча відповіді, наведені вище, більш-менш правильні, ви можете зіткнутися з проблемою, якщо розмір масиву не ділиться на 2, внаслідок чого a / 2
, як це не дивно, є плаваючий в python 3.0 та в попередній версії, якщо ви вкажіть from __future__ import division
на початку свого сценарію. Вам в будь-якому випадку краще піти на ціле ділення, тобто a // 2
для того, щоб отримати "вперед" сумісність вашого коду.
Це схоже на інші рішення, але трохи швидше.
# 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):]
Ще одна проблема у 2020 році ... Ось узагальнення проблеми. Я інтерпретую "розділити список навпіл" як .. (тобто два списки, і не повинно бути переливу на третій масив у разі непарного виходу тощо). Наприклад, якщо довжина масиву дорівнює 19 і ділення на два, використовуючи // оператор, дає 9, і ми отримаємо два масиви довжиною 9 та один масив (третій) довжиною 1 (тобто загалом три масиви). Якщо ми хотіли б загальним рішенням постійно давати два масиви, я вважаю, що ми задоволені отриманими дуетними масивами, які не мають однакової довжини (один буде довший, ніж інший). І це вважається нормальним, щоб порядок змішувався (чергувався в цьому випадку).
"""
arrayinput --> is an array of length N that you wish to split 2 times
"""
ctr = 1 # lets initialize a counter
holder_1 = []
holder_2 = []
for i in range(len(arrayinput)):
if ctr == 1 :
holder_1.append(arrayinput[i])
elif ctr == 2:
holder_2.append(arrayinput[i])
ctr += 1
if ctr > 2 : # if it exceeds 2 then we reset
ctr = 1
Ця концепція працює для будь-якої кількості розділів списку, як вам завгодно (вам доведеться налаштувати код залежно від того, скільки частин списку ви хочете). І інтерпретувати досить просто. Щоб пришвидшити речі, ви навіть можете записати цю петлю в cython / C / C ++, щоб прискорити роботу. Потім знову я спробував цей код у відносно невеликих списках ~ 10 000 рядків, і він закінчується за частку секунди.
Всього два мої центи.
Дякую!