Si tuviera una lista, digamos
lst = ['hello', 'foo', 'test', 'world', 'bar', 'idk'] Me gustaría dividirlo en una sublista con 'foo' y 'bar' como palabras clave de inicio y final, para obtener
lst = ['hello', ['foo', 'test', 'world', 'bar'], 'idk']La forma en que estoy haciendo esto actualmente es la siguiente.
def findLoop(t): inds = [index for index, item in enumerate(t) if item in ["FOO", "BAR"]] centre = inds[(len(inds)/2)-1:(len(inds)/2)+1] newCentre = t[centre[0]:centre[1]+1] return t[:centre[0]] + [newCentre] + t[centre[1]+1:] def getLoops(t): inds = len([index for index, item in enumerate(t) if item in ["FOO", "BAR"]]) for i in range(inds): t = findLoop(t) return tEsto parece un poco complicado, pero funciona muy bien para las palabras clave de inicio/fin anidadas, por lo que las sublistas se pueden formar dentro de las sublistas, pero no funciona para varias palabras clave de inicio/fin que no están una dentro de la otra. Estar anidado aún no es importante, por lo que agradecería cualquier ayuda.
Una forma de usar el corte:
>>> lst = ['hello', 'foo', 'test', 'world', 'bar', 'idk'] >>> a=lst.index('foo') # locate start word >>> b=lst.index('bar')+1 # locate end word >>> lst[a:b] = [lst[a:b]] # replace list slice with a list of the slice >>> lst ['hello', ['foo', 'test', 'world', 'bar'], 'idk']inicio múltiple, extremos (basado en la respuesta de Mark Tolonen)
lst = ['hello', 'foo', 'test', 'world', 'bar', 'idk','am'] t = [('foo','test'),('world','idk')] def sublists(lst, t): for start,end in t: a=lst.index(start) b=lst.index(end)+1 lst[a:b] = [lst[a:b]] return lst print(sublists(lst,t))Devoluciones:
['hello', ['foo', 'test'], ['world', 'bar', 'idk'], 'am']Usando el corte, sin soporte para listas anidadas:
>>> lst = ['hello', 'foo', 'test', 'world', 'bar', 'idk'] >>> start_idx = lst.index('foo') >>> end_idx = lst.index('bar') >>> lst[:start_idx] + [lst[start_idx:end_idx+1]] + lst[end_idx+1:] ['hello', ['foo', 'test', 'world', 'bar'], 'idk']