multiple into how delimiters python list split

into - split python 3



Python dividiendo una lista basada en una palabra delimitadora (4)

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 pitónica 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


La solución de @NPE me parece muy pitónica. Este es otro que usa 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 .


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).


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 .


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)