Python dividiendo una lista basada en una palabra delimitadora

Tengo una lista que contiene varios valores de cadena. Quiero dividir la lista cada vez que veo WORD . El resultado será una lista de listas (que serán las sublistas de la lista original) que contienen exactamente una instancia de la WORD Puedo hacer esto utilizando un bucle, pero ¿hay alguna forma más pythonica de lograrlo?

Ejemplo = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']

resultado = [['A'], ['WORD','B','C'],['WORD','D']]

Esto es lo que he intentado, pero en realidad no logra lo que quiero ya que pondrá a WORD en una lista diferente en la que debería estar:

 def split_excel_cells(delimiter, cell_data): result = [] temp = [] for cell in cell_data: if cell == delimiter: temp.append(cell) result.append(temp) temp = [] else: temp.append(cell) return result 

Yo usaría un generador:

 def group(seq, sep): g = [] for el in seq: if el == sep: yield g g = [] g.append(el) yield g ex = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D'] result = list(group(ex, 'WORD')) print(result) 

Esto imprime

 [['A'], ['WORD', 'B', 'C'], ['WORD', 'D']] 

El código acepta cualquier iterable y produce un iterable (que no tiene que aplanar en una lista si no quiere).

 import itertools lst = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D'] w = 'WORD' spl = [list(y) for x, y in itertools.groupby(lst, lambda z: z == w) if not x] 

esto crea una lista dividida sin delimitadores, lo que me parece más lógico:

 [['A'], ['B', 'C'], ['D']] 

Si insiste en que se incluyan los delimitadores, esto debería hacer el truco:

 spl = [[]] for x, y in itertools.groupby(lst, lambda z: z == w): if x: spl.append([]) spl[-1].extend(y) 

La solución de @NPE me parece muy pythonica. Este es otro uso de itertools :

 from itertools import izip, chain example = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D'] indices = [i for i,x in enumerate(example) if x=="WORD"] pairs = izip(chain([0], indices), chain(indices, [None])) result = [example[i:j] for i, j in pairs] 

Este código se basa principalmente en esta respuesta .

Dado

 import more_itertools as mit iterable = ["A", "WORD", "B" , "C" , "WORD" , "D"] pred = lambda x: x == "WORD" 

Código

 list(mit.split_before(iterable, pred)) # [['A'], ['WORD', 'B', 'C'], ['WORD', 'D']] 

more_itertools es una biblioteca de terceros instalable a través de > pip install more_itertools .

Ver también split_at y split_after .