Ich suche nach einer Möglichkeit, eine Python-Liste einfach in zwei Hälften zu teilen.
Wenn ich also ein Array habe:
A = [0,1,2,3,4,5]
Ich würde bekommen können:
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)
B = A[:(len(A) // 10) * 8]
C = A[(len(A) // 10) * 8:]
Eine etwas allgemeinere Lösung (Sie können die Anzahl der gewünschten Teile angeben und nicht nur in zwei Hälften teilen):
BEARBEITEN : Der Beitrag wurde aktualisiert, um ungerade Listenlängen zu verarbeiten
EDIT2 : Aktualisiere den Beitrag erneut basierend auf Brians informativen Kommentaren
quelle
//
bedeutet ganzzahlige Division. Sie sollten nicht ausgelassen werden, da sie für diese Arbeit sehr wichtig sind.n
- die vordefinierte Länge der Ergebnisarraysquelle
Prüfung:
Ergebnis:
quelle
for i,j in zip(list,lengths): print(split(i,j))
. Dielist
undlengths
Listen haben die gleiche Länge. j wechselt: 5,4,5,4,5, und die Aufteilungsfunktion arbeitet bei den ersten beiden Abwechslungen, dh sie teilt die erstei
der Liste durch 5 und 4, ABER bei der nächsten Iteration teilt sie sie bei 4,4 auf. 1. : \ Bitte antworten Sie, wenn Sie möchten, dass ich mehr erkläre (eine neue Frage posten)Wenn Sie sich nicht für die Bestellung interessieren ...
list[::2]
Ruft jedes zweite Element in der Liste ab dem 0. Element ab.list[1::2]
Ruft jedes zweite Element in der Liste ab dem ersten Element ab.quelle
list
durch Abschatten deslist(...)
eingebauten Arg . Ich habe allgemein gesehenlst
undlist_
verwendet, um es zu vermeiden.B,C=A[:len(A)/2],A[len(A)/2:]
quelle
Hier ist eine gängige Lösung, die arr in count part aufteilt
quelle
Ich habe getestet, und der doppelte Schrägstrich ist erforderlich, um die int-Teilung in Python 3 zu erzwingen. Mein ursprünglicher Beitrag war korrekt, obwohl wysiwyg aus irgendeinem Grund in Opera pleite war.
quelle
Es gibt ein offizielles Python-Rezept für den allgemeineren Fall der Aufteilung eines Arrays in kleinere Arrays mit einer Größe
n
.Dieses Code-Snippet stammt von der Python-itertools-Dokumentseite .
quelle
Mit Liste schneiden . Die Syntax ist grundsätzlich
my_list[start_index:end_index]
Um die erste Hälfte der Liste zu erhalten, schneiden Sie vom ersten Index nach
len(i)//2
(wo//
ist die Ganzzahldivision - also3//2 will give the floored result of
1, instead of the invalid list index of
1,5`):..und tauschen Sie die Werte aus, um die zweite Hälfte zu erhalten:
quelle
3//2
gibt das Ergebnis so aus1
, dass Sie das erhalteni[:1]
, was Sie erhalten[0]
undi[1:]
das gibt[1, 2]
Wenn Sie eine große Liste haben, ist es besser, itertools zu verwenden und eine Funktion zu schreiben, um jedes Teil nach Bedarf zu erhalten:
Sie können dies wie folgt verwenden:
Die Ausgabe ist:
Vielen Dank an @thefourtheye und @Bede Constantinides
quelle
10 Jahre später .. Ich dachte - warum nicht noch einen hinzufügen:
quelle
Obwohl die obigen Antworten mehr oder weniger korrekt sind, können Probleme auftreten, wenn die Größe Ihres Arrays nicht durch 2 teilbar
a / 2
ist Geben Siefrom __future__ import division
am Anfang Ihres Skripts an. In jedem Fall ist es besser, sich für eine Ganzzahldivision zu entscheiden, dha // 2
um die "Vorwärts" -Kompatibilität Ihres Codes zu erreichen.quelle
Dies ähnelt anderen Lösungen, ist jedoch etwas schneller.
quelle
Mit Hinweisen von @ChristopheD
quelle
quelle
Eine weitere Sichtweise auf dieses Problem im Jahr 2020 ... Hier ist eine Verallgemeinerung des Problems. Ich interpretiere das 'Teilen einer Liste in zwei Hälften' als .. (dh nur zwei Listen und es darf kein Übergreifen auf ein drittes Array im Falle eines ungeraden Outs usw. geben). Wenn zum Beispiel die Array-Länge 19 ist und eine Division durch zwei mit dem Operator // 9 ergibt, erhalten wir zwei Arrays der Länge 9 und ein Array (Drittel) der Länge 1 (also insgesamt drei Arrays). Wenn wir möchten, dass eine allgemeine Lösung immer zwei Arrays ergibt, gehe ich davon aus, dass wir mit den resultierenden Duo-Arrays zufrieden sind, die nicht gleich lang sind (eines ist länger als das andere). Und dass davon ausgegangen wird, dass es in Ordnung ist, die Reihenfolge zu mischen (in diesem Fall abwechselnd).
Dieses Konzept funktioniert für eine beliebige Anzahl von Listenpartitionen, wie Sie möchten (Sie müssten den Code abhängig von der Anzahl der gewünschten Listenteile anpassen). Und ist ziemlich einfach zu interpretieren. Um die Dinge zu beschleunigen, können Sie diese Schleife sogar in Cython / C / C ++ schreiben, um die Dinge zu beschleunigen. Andererseits habe ich diesen Code in relativ kleinen Listen mit ~ 10.000 Zeilen ausprobiert und er endet in Sekundenbruchteilen.
Nur meine zwei Cent.
Vielen Dank!
quelle