Ich suche nach einer Möglichkeit, eine Python-Liste leicht zu halbieren.
Wenn ich also ein Array habe:
A = [0,1,2,3,4,5]
Ich könnte bekommen:
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:]
Wenn Sie eine Funktion wünschen:
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)
Eine etwas allgemeinere Lösung (Sie können die Anzahl der gewünschten Teile angeben, nicht nur "in zwei Hälften teilen"):
EDIT: Der Beitrag wurde aktualisiert, um ungerade Listenlängen zu verarbeiten
EDIT2 : Update-Post erneut basierend auf Brians informativen Kommentaren
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
- die vordefinierte Länge von Ergebnis-Arrays
def split(arr, size):
arrs = []
while len(arr) > size:
pice = arr[:size]
arrs.append(pice)
arr = arr[size:]
arrs.append(arr)
return arrs
Prüfung:
x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
print(split(x, 5))
ergebnis:
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13]]
Hier ist eine gängige Lösung, Split-Arr in Count-Teil
def split(arr, count):
return [arr[i::count] for i in range(count)]
B,C=A[:len(A)/2],A[len(A)/2:]
Wenn Sie sich nicht für die Bestellung interessieren ...
def split(list):
return list[::2], list[1::2]
list[::2]
erhält jedes zweite Element in der Liste, beginnend mit dem 0-ten Element.list[1::2]
ruft jedes zweite Element in der Liste ab dem 1. Element auf.
def splitter(A):
B = A[0:len(A)//2]
C = A[len(A)//2:]
return (B,C)
Ich habe es getestet und der doppelte Schrägstrich ist erforderlich, um die Int Division in Python 3 zu erzwingen.
Es gibt einen offiziellen Python-Rezept für den allgemeineren Fall der Aufteilung eines Arrays in kleinere Arrays der Größe 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)
Dieses Codeausschnitt stammt von der Dokumentseite python itertools .
Verwenden von Listenaufteilung . Die Syntax ist im Grunde 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]
Um die erste Hälfte der Liste zu erhalten, schneiden Sie vom ersten Index zu len(i)/2
...
>>> i[:len(i)/2]
[0, 1, 2]
..und tauschen Sie die Werte um, um die zweite Hälfte zu erhalten:
>>> i[len(i)/2:]
[3, 4, 5]
Obgleich die obigen Antworten mehr oder weniger korrekt sind, kann es zu Problemen kommen, wenn die Größe Ihres Arrays nicht durch 2 teilbar ist, da a / 2
ein ungerades Wesen ist und in Python 3.0 und in früheren Versionen if ein Float ist Sie geben from __future__ import division
am Anfang Ihres Skripts an. Es ist auf jeden Fall besser für eine Ganzzahldivision, d. H. a // 2
, um die Kompatibilität Ihres Codes "vorwärts" zu erhalten.
Dies ist ähnlich wie bei anderen Lösungen, jedoch etwas schneller.
# 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:]
Wenn Sie eine große Liste haben, sollten Sie itertools verwenden und eine Funktion schreiben, um jedes Teil nach Bedarf zu ermitteln:
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)]
Sie können dies wie folgt verwenden:
A = [0, 1, 2, 3, 4, 5, 6]
size = len(A) // 2
for sample in make_chunks(A, size):
print(sample)
Die Ausgabe ist:
[0, 1, 2]
[3, 4, 5]
[6]
Danke an @thefourtheye und @Bede Constantinides
10 Jahre später .. Ich dachte - warum nicht noch einen hinzufügen:
arr = 'Some random string' * 10; n = 4
print([arr[e:e+n] for e in range(0,len(arr),n)])
Mit Hinweisen von @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)
#for python 3
A = [0,1,2,3,4,5]
l = len(A)/2
B = A[:int(l)]
C = A[int(l):]