2009-04-13 39 views
387

Quiero que mi función python divida una oración (entrada) y almacene cada palabra en una lista. El código que he escrito hasta ahora divide la oración, pero no almacena las palabras como una lista. ¿Cómo puedo hacer eso?¿Cómo dividir una cadena en una lista?

def split_line(text): 

    # split the text 
    words = text.split() 

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

     # print the word 
     print(word) 
+1

¿Qué parte de este código no funciona? ¿Puede proporcionar el mensaje de error o el problema que está teniendo? –

+2

Tal como está, se imprimirá la lista completa de palabras para cada palabra de la lista. Creo que quisiste usar 'print (word)' como tu última línea. – tgray

+19

La pregunta se ha editado para incluir la respuesta correcta, por lo que ya no tiene sentido – Joop

Respuesta

318
text.split() 

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

En segundo lugar, podría ser un error tipográfico, pero tiene su bucle un poco en mal estado. Si realmente quería usar append, sería:

words.append(word) 

no

word.append(words) 
319

divide la cadena en text en ningún ejecuciones consecutivas de espacios en blanco.

words = text.split()  

dividir la cadena en text el delimitador: ",".

words = text.split(",") 

La variable palabras será un list y contienen las palabras de text dividida sobre el delimitador.

66

str.split()

devolver una lista de las palabras en la cadena, usando SEP el delimitador ... Si no se especifica sep o None, se aplica un algoritmo de división diferente: las ejecuciones de espacios en blanco consecutivos se consideran como un único separador, y el resultado no contendrá 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'] 
>>> 
+0

@warvariuc - debería tener un enlace a https://docs.python.org/2/library/stdtypes.html#str.split – gimel

2

creo que está confundido debido a un error tipográfico.

Reemplazar print(words) con print(word) dentro de su bucle de tener cada palabra impresa en una línea diferente

13

Quiero que mi función de Python para dividir una oración (entrada) y almacenar cada palabra en una lista

El método str().split() hace esto, se toma una cadena, lo 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 escribió en lugar de print(words)print(word):

Cambiar el nombre de la variable word-current_word, esto es lo que tenía:

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

..cuando debería haber hecho:

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

Si por alguna razón se quiere construir manualmente una lista en el bucle, se utiliza el método de la lista append(), tal vez porque quiere 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, utilizando un list-comprehension:

my_list = [current_word.lower() for current_word in words] 
38

Dependiendo de lo que va a hacer con su frase-as-a-lista, es posible que desee mira el Natural Language Took Kit. Se ocupa en gran medida del procesamiento y la evaluación del texto. 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 puntuacion no desea y utilizar sólo palabras.

Tenga en cuenta que las otras soluciones que utilizan string.split() son mejores si no planea realizar ninguna manipulación compleja de la sección.

+4

'split()' depende del espacio en blanco como separador, por lo que no se podrá separar palabras con guiones, y frases largas separadas no se dividirán también. Y si la oración contiene cualquier puntuación sin espacios, esos 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() '. – hobs

+1

Potencialmente útil, aunque no caracterizaría esto como una división en "palabras". Por cualquier definición sencilla en inglés, '',' 'y' "' s" 'no son palabras. Normalmente, si quisieras dividir la oración de arriba en "palabras" de una manera consciente de la puntuación, querrás quitar la coma y obtener '" fox's "' como una sola palabra. –

+1

Python 2.7+ a partir de abril de 2016. – AnneTheAgile

20

¿Qué le parece este algoritmo? Dividir texto en espacios en blanco, luego recortar la puntuación. Esto elimina cuidadosamente la puntuación del borde de las palabras, sin dañar los apóstrofos 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'] 
+2

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óstrofo posterior en las 'ranas 'posesivas (como en' ranas' piernas') son parte de la palabra, pero serán eliminados por este algoritmo. El manejo correcto de las abreviaturas se puede lograr * aproximadamente * mediante la detección de inicializaciones separadas por puntos más el uso de un diccionario de casos especiales (como 'Mr.',' Mrs'). Distinguir apóstrofes posesivos de 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. –

+2

@MarkAmery Tienes razón. También se me ocurrió que algunos signos de puntuación, como el guión, pueden separar palabras sin espacios. –

+0

¡OMG! Amo Python – Fandango68

10

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

>>> import shlex 
>>> shlex.split("sudo echo 'foo && bar'") 
['sudo', 'echo', 'foo && bar'] 
Cuestiones relacionadas