Szukam sposobu na łatwe podzielenie listy Pythona na pół.
Więc jeśli mam tablicę:
A = [0,1,2,3,4,5]
Byłbym w stanie uzyskać:
B = [0,1,2]
C = [3,4,5]
Szukam sposobu na łatwe podzielenie listy Pythona na pół.
Więc jeśli mam tablicę:
A = [0,1,2,3,4,5]
Byłbym w stanie uzyskać:
B = [0,1,2]
C = [3,4,5]
Odpowiedzi:
A = [1,2,3,4,5,6]
B = A[:len(A)//2]
C = A[len(A)//2:]
Jeśli chcesz mieć funkcję:
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:]
Trochę bardziej ogólne rozwiązanie (możesz określić liczbę części, które chcesz, a nie tylko podzielić je na pół):
EDYCJA : zaktualizowany post do obsługi nieparzystych długości list
EDIT2 : ponownie zaktualizuj post na podstawie pouczających komentarzy Briana
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)
//
oznacza dzielenie liczb całkowitych. Nie należy ich pomijać, ponieważ są one niezbędne do wykonania tej pracy.
f = lambda A, n=3: [A[i:i+n] for i in range(0, len(A), n)]
f(A)
n
- predefiniowana długość tablic wynikowych
def split(arr, size):
arrs = []
while len(arr) > size:
pice = arr[:size]
arrs.append(pice)
arr = arr[size:]
arrs.append(arr)
return arrs
Test:
x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
print(split(x, 5))
wynik:
[[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
I lengths
wykazy mają taką samą długość. j jest naprzemiennie: 5,4,5,4,5, a funkcja split działa na dwóch pierwszych przemianach, tj. dzieli pierwszą i
z listy na 5 i 4, ALE w następnej iteracji dzieli ją na 4,4, 1. : \ Proszę o odpowiedź, jeśli chcesz, żebym wyjaśnił więcej (opublikuj nowe pytanie)
Jeśli nie zależy Ci na zamówieniu ...
def split(list):
return list[::2], list[1::2]
list[::2]
pobiera co drugi element listy, zaczynając od elementu zerowego.
list[1::2]
pobiera co drugi element listy, zaczynając od pierwszego elementu.
list
z cieniowaniem list(...)
wbudowanego. Widziałem lst
i list_
często używałem, aby tego uniknąć.
Oto powszechne rozwiązanie, podzielone na część licznikową
def split(arr, count):
return [arr[i::count] for i in range(count)]
def splitter(A):
B = A[0:len(A)//2]
C = A[len(A)//2:]
return (B,C)
Testowałem i podwójny ukośnik jest wymagany do wymuszenia dzielenia int w Pythonie 3. Mój oryginalny post był poprawny, chociaż z jakiegoś powodu wysiwyg zepsuł się w Operze.
Istnieje oficjalna recepta na Pythona dla bardziej uogólnionego przypadku podziału tablicy na mniejsze tablice o rozmiarze 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)
Ten fragment kodu pochodzi ze strony dokumentacji python itertools .
Korzystanie z wycinania list . W zasadzie składniamy_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]
Aby uzyskać pierwszą połowę listy, wycinamy od pierwszego indeksu do len(i)//2
(gdzie //
jest dzielenie liczby całkowitej - czyli 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 zamień wartości wokół, aby uzyskać drugą połowę:
>>> i[len(i)//2:]
[3, 4, 5]
3//2
daje wynik tak 1
, że otrzymujesz, i[:1]
który daje [0]
i i[1:]
który daje[1, 2]
Jeśli masz dużą listę, lepiej użyć itertools i napisać funkcję, aby uzyskać każdą część w razie potrzeby:
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)]
Możesz użyć tego jak:
A = [0, 1, 2, 3, 4, 5, 6]
size = len(A) // 2
for sample in make_chunks(A, size):
print(sample)
Wynik to:
[0, 1, 2]
[3, 4, 5]
[6]
Podziękowania dla @thefourtheye i @Bede Constantinides
Chociaż powyższe odpowiedzi są mniej więcej poprawne, możesz napotkać kłopoty, jeśli rozmiar twojej tablicy nie jest podzielny przez 2, w wyniku tego a / 2
, że jest nieparzystą, jest zmiennoprzecinkową w Pythonie 3.0, a we wcześniejszej wersji, jeśli określić from __future__ import division
na początku skryptu. W każdym razie lepiej jest wybrać dzielenie całkowitoliczbowe, tj. a // 2
W celu uzyskania zgodności kodu "do przodu".
Jest to podobne do innych rozwiązań, ale trochę szybsze.
# 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):]
Inne podejście do tego problemu w 2020 roku ... Oto uogólnienie problemu. Interpretuję „podziel listę na pół” jako… (tj. Tylko dwie listy i nie będzie żadnego efektu przeniesienia na trzecią tablicę w przypadku nieparzystej listy itp.). Na przykład, jeśli długość tablicy wynosi 19, a dzielenie przez dwa za pomocą operatora // daje 9, a otrzymamy dwie tablice o długości 9 i jedną (trzecią) o długości 1 (czyli w sumie trzy tablice). Jeśli chcielibyśmy, aby ogólne rozwiązanie dawało dwie tablice przez cały czas, zakładam, że jesteśmy zadowoleni z wynikowych tablic duet, które nie mają równej długości (jedna będzie dłuższa od drugiej). I że założono, że mieszanie zamówienia (naprzemiennie w tym przypadku) jest w porządku.
"""
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
Ta koncepcja działa dla dowolnej ilości partycji listy, jak chcesz (musiałbyś dostosować kod w zależności od tego, ile części listy chcesz). I jest raczej łatwy do interpretacji. Aby przyspieszyć działanie, możesz nawet napisać tę pętlę w cython / C / C ++, aby przyspieszyć działanie. Z drugiej strony wypróbowałem ten kod na stosunkowo małych listach ~ 10000 wierszy i kończy się w ułamku sekundy.
Tylko moje dwa centy.
Dzięki!