Was ist der beste Weg, um eine Liste in ungefähr gleiche Teile zu teilen ? Wenn die Liste beispielsweise 7 Elemente enthält und in 2 Teile aufgeteilt ist, möchten wir 3 Elemente in einem Teil erhalten, und der andere sollte 4 Elemente enthalten.
Ich suche so etwas even_split(L, n)
, das L
in n
Teile zerbricht .
def chunks(L, n):
""" Yield successive n-sized chunks from L.
"""
for i in range(0, len(L), n):
yield L[i:i+n]
Der obige Code gibt Blöcke von 3 statt 3 Blöcken an. Ich könnte einfach transponieren (darüber iterieren und das erste Element jeder Spalte nehmen, diesen Teil eins nennen, dann das zweite nehmen und es in Teil zwei setzen usw.), aber das zerstört die Reihenfolge der Elemente.
>>> chunkIt(range(8), 6)
=>[[0], [1], [2, 3], [4], [5], [6], [7]]
chunkIt(range(10), 9)
sollte 9 Teile zurückgeben, aber das tut es nicht.Sie können es ziemlich einfach als Listengenerator schreiben:
Beispiel:
quelle
n = min(n, len(a)) # don't create empty buckets
in Zeile 1 ein, um zu vermeiden, dass in Szenarien wielist(split(range(X, Y)))
whereX < Y
Dies ist die Daseinsberechtigung für
numpy.array_split
*:* Gutschrift an Zero Piraeus in Raum 6
quelle
*
inprint
für?print(L)
und drucke (* L). Siehe auch stackoverflow.com/a/36908/2184122 oder suchen Sie nach "Python-Verwendung von Sternchen".Solange Sie nichts Dummes wie ununterbrochene Brocken wollen:
quelle
zip(*chunkify(range(13), 3))
Ergebnisse in[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)]
Ändern des Codes, um
n
Blöcke zu ergeben, anstatt Blöcke vonn
:was gibt:
Dies ordnet die zusätzlichen Elemente der endgültigen Gruppe zu, die nicht perfekt ist, aber gut in Ihrer Spezifikation von "ungefähr N gleichen Teilen" liegt :-) Damit meine ich, 56 Elemente wären besser als (19,19,18), während dies ergibt (18, 18, 20).
Sie können die ausgewogenere Ausgabe mit dem folgenden Code erhalten:
welche Ausgänge:
quelle
for x in chunks(mylist,num): print x
bekomme ich die gewünschten Stücke, aber zwischen ihnen bekomme ich eine leere Liste. Irgendeine Idee warum? Das heißt, ich bekomme viele[]
, eine nach jedem Stück.Wenn Sie
n
Elemente in grobek
Blöcke unterteilen, können Sien % k
Blöcke 1 Element größer als die anderen Blöcke machen, um die zusätzlichen Elemente zu verteilen.Der folgende Code gibt Ihnen die Länge für die Chunks an:
Beispiel:
n=11, k=3
Ergebnisse in[4, 4, 3]
Sie können dann einfach die Startindizes für die Chunks berechnen:
Beispiel:
n=11, k=3
Ergebnisse in[0, 4, 8]
Wenn
i+1
wir den th-Block als Grenze verwenden, erhalten wir, dass deri
th-Block der Listel
mit lenn
istAls letzten Schritt erstellen Sie eine Liste aus allen Blöcken mit Listenverständnis:
Beispiel:
n=11, k=3, l=range(n)
Ergebnisse in[range(0, 4), range(4, 8), range(8, 11)]
quelle
Dies führt die Aufteilung durch einen einzelnen Ausdruck durch:
Die Liste in diesem Beispiel hat die Größe 18 und ist in 5 Teile unterteilt. Die Größe der Teile unterscheidet sich in nicht mehr als einem Element.
quelle
Siehe
more_itertools.divide
:Installieren über
> pip install more_itertools
.quelle
Hier ist eine, die hinzugefügt wird
None
, um die Listen gleich lang zu machenquelle
Hier ist meine Lösung:
Produziert
quelle
Hier ist ein Generator, der eine beliebige positive (ganzzahlige) Anzahl von Chunks verarbeiten kann. Wenn die Anzahl der Chunks größer als die Länge der Eingabeliste ist, sind einige Chunks leer. Dieser Algorithmus wechselt zwischen kurzen und langen Blöcken, anstatt sie zu trennen.
Ich habe auch Code zum Testen der
ragged_chunks
Funktion eingefügt.Wir können dies etwas effizienter gestalten, indem wir die Multiplikation in den
range
Aufruf exportieren , aber ich denke, die vorherige Version ist besser lesbar (und DRYer).quelle
Schauen Sie sich numpy.split an :
quelle
Implementierung mit der Methode numpy.linspace.
Geben Sie einfach die Anzahl der Teile an, in die das Array unterteilt werden soll. Die Unterteilungen sind nahezu gleich groß.
Beispiel:
Gibt:
quelle
Meine Lösung, leicht zu verstehen
Und der kürzeste Einzeiler auf dieser Seite (geschrieben von meinem Mädchen)
quelle
Listenverständnis verwenden:
quelle
Ein anderer Weg wäre so etwas, die Idee hier ist, Zackenbarsch zu verwenden, aber loszuwerden
None
. In diesem Fall werden im ersten Teil der Liste alle "kleinen Teile" aus Elementen und im späteren Teil der Liste "größere Teile" gebildet. Die Länge von 'größeren Teilen' beträgt len (small_parts) + 1. Wir müssen x als zwei verschiedene Unterteile betrachten.Die Art und Weise, wie ich es eingerichtet habe, gibt eine Liste von Tupeln zurück:
quelle
Hier ist eine weitere Variante, bei der die "verbleibenden" Elemente nacheinander gleichmäßig auf alle Blöcke verteilt werden, bis keine mehr vorhanden sind. In dieser Implementierung treten die größeren Blöcke zu Beginn des Prozesses auf.
Generieren Sie beispielsweise 4 Blöcke aus einer Liste von 14 Elementen:
quelle
Das gleiche wie Aufgabe der Antwort, sondern berücksichtigt Listen mit Größe , die kleiner als die Anzahl der chuncks.
Wenn n (Anzahl der Chunks) 7 ist und lst (die zu teilende Liste) [1, 2, 3] ist, sind die Chunks [[0], [1], [2]] anstelle von [[0], [1 ], [2], [], [], [], []]
quelle
Sie könnten auch verwenden:
quelle
Beispiel:
l = [a for a in range(97)]
sollte aus 10 Teilen bestehen, die jeweils 9 Elemente außer dem letzten haben.Ausgabe:
quelle
Angenommen, Sie möchten eine Liste [1, 2, 3, 4, 5, 6, 7, 8] in 3 Elementlisten aufteilen
wie [[1,2,3], [4, 5, 6], [7, 8]] , wo, wenn die letzten verbleibenden Elemente kleiner als 3 sind, sie zusammen gruppiert werden.
Ausgabe: [[1,2,3], [4, 5, 6], [7, 8]]
Wenn die Länge eines Teils 3 beträgt. Ersetzen Sie 3 durch Ihre eigene Blockgröße.
quelle
1>
2>
quelle
Hier ist meine Version (inspiriert von Max)
quelle
Das Runden des Linspace und dessen Verwendung als Index ist eine einfachere Lösung als von amit12690 vorgeschlagen.
quelle
Aus diesem Link ausgewählt , und das hat mir geholfen. Ich hatte eine vordefinierte Liste.
quelle
Angenommen, Sie möchten in 5 Teile teilen:
quelle
Ich habe in diesem Fall selbst Code geschrieben:
divid_ports (1, 10, 9) würde zurückkehren
quelle
Dieser Code funktioniert für mich (Python3-kompatibel):
Beispiel (für Bytearray- Typ, aber es funktioniert auch für Listen ):
quelle
Dieser liefert Blöcke der Länge <= n,> = 0
def
beispielsweise
quelle
Ich habe die meisten Lösungen ausprobiert, aber sie haben in meinem Fall nicht funktioniert. Daher erstelle ich eine neue Funktion, die in den meisten Fällen und für jede Art von Array funktioniert:
quelle