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)