veces una tiene separar saber repite repetidos que por palabras listas lista funcion frase elementos elemento cuantas contar como caracter cadenas python python-3.x list split

python - tiene - Cómo dividir una lista de cadenas en sub-listas de cadenas por un elemento de cadena específico



listas en python (6)

Aquí hay otra manera de usar solo las operaciones de lista estándar (¡sin dependencias de otras bibliotecas!). Primero encontramos los puntos de división y luego creamos sublistas alrededor de ellos; Observe que el primer elemento se trata como un caso especial:

a = [''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.''] indexes = [-1] + [i for i, x in enumerate(a) if x == ''.''] [a[indexes[i]+1:indexes[i+1]] for i in range(len(indexes)-1)] => [[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice'']]

Tengo una lista de palabras como abajo. Quiero dividir la lista por . . ¿Hay algún código mejor o útil en Python 3?

a = [''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.''] result = [] tmp = [] for elm in a: if elm is not ''.'': tmp.append(elm) else: result.append(tmp) tmp = [] print(result) # result: [[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice'']]

Actualizar

Agrega casos de prueba para manejarlo correctamente.

a = [''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.''] b = [''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.'', ''yes''] c = [''.'', ''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.'', ''yes''] def split_list(list_data, split_word=''.''): result = [] sub_data = [] for elm in list_data: if elm is not split_word: sub_data.append(elm) else: if len(sub_data) != 0: result.append(sub_data) sub_data = [] if len(sub_data) != 0: result.append(sub_data) return result print(split_list(a)) # [[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice'']] print(split_list(b)) # [[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice''], [''yes'']] print(split_list(c)) # [[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice''], [''yes'']]


Esta respuesta requiere la instalación de una biblioteca de terceros: iteration_utilities 1 . La función de split incluida facilita la resolución de esta tarea:

>>> from iteration_utilities import split >>> a = [''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.''] >>> list(filter(None, split(a, ''.'', eq=True))) [[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice'']]

En lugar de utilizar el parámetro eq , también puede definir una función personalizada donde dividir:

>>> list(filter(None, split(a, lambda x: x==''.''))) [[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice'']]

En caso de que quiera mantener el ''.'' También puedes usar el argumento keep_before :

>>> list(filter(None, split(a, ''.'', eq=True, keep_before=True))) [[''this'', ''is'', ''a'', ''cat'', ''.''], [''hello'', ''.''], [''she'', ''is'', ''nice'', ''.'']]

Tenga en cuenta que la biblioteca solo lo hace más fácil, es fácil (vea las otras respuestas) realizar esta tarea sin instalar una biblioteca adicional.

El filter se puede quitar si no esperas ''.'' para que aparezca al principio o al final de su lista de división.

1 Soy el autor de esa biblioteca. Está disponible vía pip o el canal conda-forge con conda .


No pude evitarlo, solo quería divertirme con esta gran pregunta:

import itertools a = [''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.''] b = [''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.'', ''yes''] c = [''.'', ''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.'', ''yes''] def split_dots(lst): dots = [0] + [i+1 for i, e in enumerate(lst) if e == ''.''] result = [list(itertools.takewhile(lambda x : x != ''.'', lst[dot:])) for dot in dots] return list(filter(lambda x : x, result)) print(split_dots(a)) # [[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice'']] print(split_dots(b)) # [[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice''], [''yes'']] print(split_dots(c)) # [[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice''], [''yes'']]


Puede hacer todo esto con un "uso de una sola línea" usando la comprensión de listas y las funciones de cadena de join , split , split y sin bibliotecas adicionales.

a = [''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.''] b = [''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.'', ''yes''] c = [''.'', ''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.'', ''yes''] In [5]: [i.strip().split('' '') for i in '' ''.join(a).split(''.'') if len(i) > 0 ] Out[5]: [[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice'']] In [8]: [i.strip().split('' '') for i in '' ''.join(b).split(''.'') if len(i) > 0 ] Out[8]: [[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice''], [''yes'']] In [9]: In [8]: [i.strip().split('' '') for i in '' ''.join(c).split(''.'') if len(i) > 0 ] Out[9]: [[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice''], [''yes'']]

@Craig tiene una actualización más simple:

[s.split() for s in '' ''.join(a).split(''.'') if s]


Puede reconstruir la cadena usando '' ''.join y use regex:

import re a = [''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.''] new_s = [b for b in [re.split(''/s'', i) for i in re.split(''/s*/./s*'', '' ''.join(a))] if all(b)]

Salida:

[[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice'']]


Usando itertools.groupby

from itertools import groupby a = [''this'', ''is'', ''a'', ''cat'', ''.'', ''hello'', ''.'', ''she'', ''is'', ''nice'', ''.''] result = [list(g) for k,g in groupby(a,lambda x:x==''.'') if not k] print (result) #[[''this'', ''is'', ''a'', ''cat''], [''hello''], [''she'', ''is'', ''nice'']]