2016-04-21 12 views
0

Angenommen, ich habe eine Liste wie folgt aus:Splitting eine Liste in eine Liste von Blockindizes

myList=['A','B','C','D','E','F','G','H','I','J','K'] 

Also, nehme ich diese Liste als n-Chargen verarbeitet werden sollen. Wenn n = 3, die Ich möchte eine Liste namens batchIdx[(0,3),(4,7),(8,10)], wo jedes Tupel auf die (start,end) Indizes von myList zeigt.

myList könnte von variabler Länge sein. Dies ist nicht einfach eine Aufteilung der Liste in gleich große Stücke. Es ist wie mit divmod().

Bearbeiten: Ich möchte tatsächlich eine Liste erstellen, die in myList indiziert. Ich werde diese Indizes in einem anderen Teil meines Programms verwenden.

Was ist der beste Weg, dies zu implementieren?

+2

Mögliche Duplikat [Wie kann man in gleichmäßig große Stücke in Python eine Liste verteilen?] (Http: // Stackoverflow. com/questions/312443/how-do-you-split-a-list-in-every-size-chunks-in-python) – styvane

+0

Möchten Sie 'batchIdx' erstellen oder' batchIdx' verwenden, um zu indizieren 'MeineListe'? –

+1

Sie wollen also: '[(0, 3), (3, 6), (6, 9), (9, 12)]' oder '[(0, 3), (3, 6), (6, 9), (9, 11)]? –

Antwort

2

aktualisiert Antwort basierend auf Frage bearbeiten:

Dies ist einfach nicht Liste in gleich große Stücke geteilt wird. Es ist wie divmod()

mit Hier ist meine Lösung, die die Indizes zurück, die eine Liste der Länge l, in n Chargen aufteilen wird:

def slice_indices(l, n): 
    q, r = divmod(l, n) 
    step = q + 1 if r else q 
    return [(i, min(i+step, l)) for i in range(0, l, step)] 

Lassen Sie uns einige Indizes zuerst sehen:

>>> slice_indices(l=11, n=3) 
[(0, 4), (4, 8), (8, 11)] 
# We get 3 batches, index covers [0, 11] so we pass. 

>>> slice_indices(l=30, n=4) 
[(0, 8), (8, 16), (16, 24), (24, 30)] 
# We get 4 batches, and index covers [0, 30], so we pass. 

Lassen Sie uns Ihre Liste damit indexieren:

>>> [myList[slice(*s)] for s in slice_indices(l=11, n=3)] 
[['A', 'B', 'C', 'D'], ['E', 'F', 'G', 'H'], ['I', 'J', 'K']] 

Und das nicht bricht an den Grenzen der n = 1 oder n = l

>>> [myList[slice(*s)] for s in slice_indices(l=11, n=1)] 
[['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']] # 1 batch 
>>> [myList[slice(*s)] for s in slice_indices(l=11, n=11)] 
[['A'], ['B'], ['C'], ['D'], ['E'], ['F'], ['G'], ['H'], ['I'], ['J'], ['K']] # 11 batches 
+0

Wenn das tatsächlich das OP ist (ich bin mir nicht sicher) - dann ist '[l [slice (* s)] für s in Indizes] 'genauso schön ... –

+0

Das Ziel ist genau diese zu erstellen Tupel. – polku

+0

Ich glaube nicht, dass dies das ist, was das OP verlangt. – Chris

0
[(i-n,i) for i in range(n,len(myList)+1,n+1)] 
+0

Dieser Code gibt eine Liste zurück, die gleich große Blöcke von n erzeugt. Nicht was ich brauche. Ich möchte n Anzahl von Scheiben/Chargen oder Chunks.Also sagen meine Liste hat Länge 20. und meine n = 3, was ich brauche, sind die Start-, Ende-Indizes, die verwendet werden können, um meine Liste in 3 Chargen, Gruppen – user1050648

+0

Agree diesen Code Einschränkungen die Größe der Scheiben zu "n", nicht die Anzahl der Chargen zu "n" – bakkal

Verwandte Themen