Dividir una lista en trozos determinados por un separador.

Tengo esta lista (python):

[item1], [item2], [item3], [/], [item4], [item5], [item6], [/] … y así sucesivamente.

Quiero separarlos en trozos y los elementos que irán a cada trozo son los elementos antes del separador “/”.

Así que mis trozos se verían como:

chunk1: [item1], [item2], [item3] chunk2: [item4], [item5], [item6]

He intentado y probado, nada eficiente vino a la mente. Intenté hacer un bucle a través de él con un elemento for y y si el elemento [x] == ‘/’ luego obtén algunas posiciones. Está muy sucio y no funciona correctamente.

Cualquier ayuda sería apreciada.

El método habitual para recostackr fragmentos contiguos es utilizar itertools.groupby , por ejemplo:

 >>> from itertools import groupby >>> blist = ['item1', 'item2', 'item3', '/', 'item4', 'item5', 'item6', '/'] >>> chunks = (list(g) for k,g in groupby(blist, key=lambda x: x != '/') if k) >>> for chunk in chunks: ... print(chunk) ... ['item1', 'item2', 'item3'] ['item4', 'item5', 'item6'] 

(Su representación de su lista [item1],[item2],[item3],[/], hace que parezca que cada uno de sus elementos en la lista es en realidad una lista, en cuyo caso el mismo enfoque funcionará, simplemente necesita para comparar con ['/'] o lo que sea su separador.)

Escribí algo más sencillo para que lo entiendas: básicamente, busca '/' , si no está allí, sigue agregando trozos. itertools.groupby pena aprender itertools.groupby , pero es una buena idea comenzar con algo más simple que uno entienda primero.

 l = ['i1', 'i2', 'i3', '/', 'i4', 'i5', 'i6', '/'] chunks = [] x = 0 chunks.append([]) # create an empty chunk to which we'd append in the loop for i in l: if i != '/': chunks[x].append(i) else: x += 1 chunks.append([]) print chunks 

Si sus elementos son cadenas, hay una manera más rápida de hacer lo que he hecho en python: básicamente, primero cree una cadena separada por el espacio ( ' ' ) y luego, primero se divide por '/' y luego por ' ' nuevamente.

 l = ['i1', 'i2', 'i3', '/', 'i4', 'i5', 'i6', '/'] s = " ".join(l) # first create a string, joining by a  it could be anything chunks2 = [x.split() for x in s.split("/")] print chunks2 

Esto también se puede hacer como (asumiendo que los fragmentos vacíos no son deseados y l es la lista que se “divide”):

 chunks, last_chunk = [], [] for x in l: if x == '/': if last_chunk: chunks.append(last_chunk) last_chunk = [] else: last_chunk.append(x) if last_chunk: chunks.append(last_chunk)