¿Cómo dividir una cadena en una lista?

574

Quiero que mi función Python divida una oración (entrada) y almacene cada palabra en una lista. Mi código actual divide la oración, pero no almacena las palabras como una lista. ¿Cómo puedo hacer eso?

def split_line(text):

    # split the text
    words = text.split()

    # for each word in the line:
    for word in words:

        # print the word
        print(words)
Gracias
fuente
1
¿Qué parte de este código no funciona? ¿Puede proporcionar el mensaje de error o el problema que está teniendo?
S.Lott
44
Tal como está, imprimirá la lista completa de palabras para cada palabra de la lista. Creo que querías usarlo print(word)como tu última línea.
tgray el

Respuestas:

487
text.split()

Esto debería ser suficiente para almacenar cada palabra en una lista. wordsya es una lista de las palabras de la oración, por lo que no hay necesidad del bucle.

En segundo lugar, puede ser un error tipográfico, pero tienes el bucle un poco desordenado. Si realmente quisiera usar append, sería:

words.append(word)

no

word.append(words)
nstehr
fuente
447

Divide la cadena en textcualquier ejecución consecutiva de espacios en blanco.

words = text.split()      

Dividir la cadena en textel delimitador: ",".

words = text.split(",")   

La variable de palabras será ay listcontendrá las palabras de textsplit en el delimitador.

zalew
fuente
86

str.split ()

Devuelve una lista de las palabras en la cadena, usando sep como delimitador ... Si sep no se especifica o es None, se aplica un algoritmo de división diferente: las ejecuciones de espacios en blanco consecutivos se consideran como un solo separador, y el resultado contendrá no hay cadenas vacías al inicio o al final si la cadena tiene espacios en blanco iniciales o finales.

>>> line="a sentence with a few words"
>>> line.split()
['a', 'sentence', 'with', 'a', 'few', 'words']
>>> 
gimel
fuente
@warvariuc - debería haberse vinculado a docs.python.org/2/library/stdtypes.html#str.split
gimel
52

Dependiendo de lo que planee hacer con su oración como una lista, es posible que desee ver el Kit de lenguaje natural . Se trata en gran medida con el procesamiento de texto y la evaluación. También puede usarlo para resolver su problema:

import nltk
words = nltk.word_tokenize(raw_sentence)

Esto tiene el beneficio adicional de dividir la puntuación.

Ejemplo:

>>> import nltk
>>> s = "The fox's foot grazed the sleeping dog, waking it."
>>> words = nltk.word_tokenize(s)
>>> words
['The', 'fox', "'s", 'foot', 'grazed', 'the', 'sleeping', 'dog', ',', 
'waking', 'it', '.']

Esto le permite filtrar cualquier puntuación que no desee y usar solo palabras.

Tenga en cuenta que las otras soluciones que usan string.split() son mejores si no planea hacer una manipulación compleja de la oración.

[Editado]

tgray
fuente
55
split()depende del espacio en blanco como separador, por lo que no se podrán separar las palabras con guiones, y las frases separadas por guiones largos tampoco se dividirán. Y si la oración contiene algún signo de puntuación sin espacios, no se pegarán. Para cualquier análisis de texto del mundo real (como para este comentario), su sugerencia nltk es mucho mejor que split () `.
placas el
2
Potencialmente útil, aunque no lo caracterizaría como una división en "palabras". Por cualquier definición simple en inglés, ','y "'s"no son palabras. Normalmente, si desea dividir la oración anterior en "palabras" de manera consciente de la puntuación, desearía eliminar la coma y obtener "fox's"una sola palabra.
Mark Amery el
1
Python 2.7+ a partir de abril de 2016.
AnneTheAgile
31

¿Qué tal este algoritmo? Divida el texto en espacios en blanco, luego recorte la puntuación. Esto elimina cuidadosamente la puntuación del borde de las palabras, sin dañar los apóstrofes dentro de palabras como we're.

>>> text
"'Oh, you can't help that,' said the Cat: 'we're all mad here. I'm mad. You're mad.'"

>>> text.split()
["'Oh,", 'you', "can't", 'help', "that,'", 'said', 'the', 'Cat:', "'we're", 'all', 'mad', 'here.', "I'm", 'mad.', "You're", "mad.'"]

>>> import string
>>> [word.strip(string.punctuation) for word in text.split()]
['Oh', 'you', "can't", 'help', 'that', 'said', 'the', 'Cat', "we're", 'all', 'mad', 'here', "I'm", 'mad', "You're", 'mad']
Coronel Panic
fuente
44
Agradable, pero algunas palabras en inglés realmente contienen signos de puntuación finales. Por ejemplo, los puntos finales en e.g.y Mrs., y el apóstrofe final en el posesivo frogs'(como en frogs' legs) son parte de la palabra, pero serán eliminados por este algoritmo. El manejo correcto de las abreviaturas se puede lograr de manera aproximada mediante la detección de los inicialismos separados por puntos y el uso de un diccionario de casos especiales (como Mr., Mrs.). Distinguir los apóstrofes posesivos de las comillas simples es dramáticamente más difícil, ya que requiere analizar la gramática de la oración en la que está contenida la palabra.
Mark Amery
2
@ MarkAmery Tienes razón. También se me ha ocurrido que algunos signos de puntuación, como el guión de em, pueden separar palabras sin espacios.
Coronel Panic
16

Quiero que mi función python divida una oración (entrada) y almacene cada palabra en una lista

El str().split()método hace esto, toma una cadena, la divide en una lista:

>>> the_string = "this is a sentence"
>>> words = the_string.split(" ")
>>> print(words)
['this', 'is', 'a', 'sentence']
>>> type(words)
<type 'list'> # or <class 'list'> in Python 3.0

El problema que tienes es debido a un error tipográfico que escribiste en print(words)lugar deprint(word) :

Cambiando el nombre de la wordvariable a current_word, esto es lo que tenía:

def split_line(text):
    words = text.split()
    for current_word in words:
        print(words)

..cuando deberías haber hecho:

def split_line(text):
    words = text.split()
    for current_word in words:
        print(current_word)

Si por alguna razón desea construir manualmente una lista en el bucle for, usaría el append()método de la lista , tal vez porque desea minúsculas todas las palabras (por ejemplo):

my_list = [] # make empty list
for current_word in words:
    my_list.append(current_word.lower())

O más un poco más ordenado, usando una lista de comprensión :

my_list = [current_word.lower() for current_word in words]
dbr
fuente
12

shlex tiene una .split()función. Se diferencia de str.split()que no conserva las citas y trata una frase citada como una sola palabra:

>>> import shlex
>>> shlex.split("sudo echo 'foo && bar'")
['sudo', 'echo', 'foo && bar']
Tarwin
fuente
10

Si desea todos los caracteres de una palabra / oración en una lista, haga esto:

print(list("word"))
#  ['w', 'o', 'r', 'd']


print(list("some sentence"))
#  ['s', 'o', 'm', 'e', ' ', 's', 'e', 'n', 't', 'e', 'n', 'c', 'e']
Barba Negra
fuente
4

Creo que estás confundido por un error tipográfico.

Reemplace print(words)con print(word)dentro de su bucle para imprimir cada palabra en una línea diferente

Aditya Mukherji
fuente