2016-07-21 5 views
4

ich nach einem Weg suchen, eine Liste in vordefinierte Scheiben aufgeteilt:Split Python-Liste in eigene Chunkgröße basierend auf der zweiten Liste

a = list(range(1, 1001)) # Added list() 
b = [200, 500, 300] 

Liste a sollte in len(b) Sublisten in Scheiben geschnitten werden, um die ersten 200 Elemente von a , die folgenden 500 und die letzten 300. Es ist sicher anzunehmen, dass sum(b) == len(a).

Gibt es eine gemeinsame Funktion dafür?

Antwort

5

einen Iterator aus der Liste Stellen (wenn es nicht ein bereits ist) und für jeden n in bn mal das next Element aus dem Iterator bekommen.

>>> a = range(1, 1001) 
>>> b = [200, 500, 300] 
>>> a_iter = iter(a) 
>>> [[next(a_iter) for _ in range(n)] for n in b] 
[[1, 
    2, 
    ... 
    199, 
    200], 
[201, 
    ... 
    700], 
[701, 
    702, 
    ... 
    999, 
    1000]] 
+0

Gelöst, ich werde in 5 Minuten akzeptieren, sobald das System es erlaubt :). – Matthias

+1

Sie würden einen Standardwert für "next" benötigen, um eine Ausnahme zu vermeiden, wenn die Chunks größer als der Inhalt von "a" sind –

3

Sie auch itertools.islice verwenden könnte einen Iterator von a in den vordefinierten Brocken zu konsumieren:

>>> from itertools import islice 
>>> b = [200, 500, 300] 
>>> a = range(1, 1001) 
>>> it = iter(a) 
>>> [list(islice(it, i)) for i in b] 
3

itertools.islice:

from itertools import islice 

a = range(1, 1001) 
b = [200, 500, 300] 

c = iter(a) 
results = [list(islice(c, length)) for length in b] 

islice verhält sich wie in Scheiben schneiden, mit der Ausnahme, dass Slice-Sequenz nimmt und Rückgabesequenz, während islice iterierbar und iterierbar zurückgibt.

Iteratoren sind "Einmalartikel" - sobald Sie ein Element daraus extrahieren, ist es nicht mehr da und das nächste Element wird zum neuen ersten Element.

Verwandte Themen