2009-04-13 12 views
387

Je veux que ma fonction python divise une phrase (entrée) et stocke chaque mot dans une liste. Le code que j'ai écrit jusqu'ici divise la phrase, mais ne stocke pas les mots sous forme de liste. Comment je fais ça?Comment diviser une chaîne en une liste?

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

Quelle partie de ce code ne fonctionne pas? Pouvez-vous fournir le message d'erreur ou le problème que vous rencontrez? –

+2

En l'état, vous allez imprimer la liste complète des mots pour chaque mot de la liste. Je pense que vous vouliez utiliser 'print (word)' comme dernière ligne. – tgray

+19

La question a été modifiée pour inclure la bonne réponse, donc cela n'a plus de sens – Joop

Répondre

318
text.split() 

Cela devrait suffire pour stocker chaque mot dans une liste. words est déjà une liste des mots de la phrase, donc il n'y a pas besoin de la boucle. Deuxièmement, il pourrait s'agir d'une faute de frappe, mais votre boucle est un peu foireuse. Si vous ne voulais vraiment utiliser append, ce serait:

words.append(word) 

pas

word.append(words) 
319

Sépare la chaîne en text lors de toutes les suites d'espaces.

words = text.split()  

diviser la chaîne en text sur delimiter: ",".

words = text.split(",") 

La variable mots sera un list et contiennent les mots de text divisés sur le delimiter.

66

str.split()

Retour une liste des mots dans la chaîne, en utilisant septembre comme le délimiteur ... Si sep n'est pas spécifié ou est None, un algorithme de division différent est appliqué: les suites d'espaces consécutifs sont considérées comme un seul séparateur, et le résultat ne contiendra pas de chaînes vides au début ou à la fin si la chaîne a des espaces avant ou arrière.

>>> line="a sentence with a few words" 
>>> line.split() 
['a', 'sentence', 'with', 'a', 'few', 'words'] 
>>> 
+0

@warvariuc - aurait dû être lié à https://docs.python.org/2/library/stdtypes.html#str.split – gimel

2

Je pense que vous êtes confus à cause d'une faute de frappe.

Remplacer print(words) avec print(word) dans votre boucle pour que chaque mot imprimé sur une autre ligne

13

Je veux que ma fonction python pour diviser une phrase (entrée) et stocker chaque mot dans une liste

La méthode str().split() fait cela, il faut une chaîne, il se divise en une liste:

>>> 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 

Le problème que vous rencontrez est à cause d'une faute de frappe, vous avez écrit print(words) au lieu de print(word):

la variable Changement de nom word-current_word, c'est ce que vous aviez:

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

..quand vous auriez dû faire:

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

Si pour une raison quelconque, vous voulez construire manuellement une liste dans la boucle, vous pouvez utiliser la liste méthode append(), peut-être parce que vous voulez en minuscules tous les mots (par exemple):

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

Ou plus un peu plus propre, en utilisant un list-comprehension:

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

selon ce que vous envisagez de faire avec votre phrase-as-a-liste, vous voudrez peut-être regardez le Natural Language Took Kit. Il traite beaucoup de traitement de texte et d'évaluation. Vous pouvez également l'utiliser pour résoudre votre problème:

import nltk 
words = nltk.word_tokenize(raw_sentence) 

Cela a l'avantage supplémentaire de séparer la ponctuation.

Exemple:

>>> 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', '.'] 

Cela vous permet de filtrer les signes de ponctuation que vous ne voulez pas et utilisez seulement des mots.

Veuillez noter que les autres solutions utilisant string.split() sont préférables si vous ne prévoyez pas de manipulation complexe de la saturation.

+4

'split()' repose sur l'espace blanc comme séparateur, de sorte qu'il ne pourra pas se séparer mots coupés - et les phrases séparées par des tirets longs échoueront également. Et si la phrase contient des signes de ponctuation sans espace, ceux-ci échoueront. Pour toute analyse de texte réel (comme pour ce commentaire), votre suggestion nltk est bien meilleure que split() '. – hobs

+1

Potentiellement utile, bien que je ne caractériserais pas cela comme se divisant en "mots". Selon toute définition anglaise, «,» et «» ne sont pas des mots. Normalement, si vous vouliez scinder la phrase ci-dessus en "mots" en tenant compte de la ponctuation, vous voudriez supprimer la virgule et obtenir "fox's" comme un seul mot. –

+1

Python 2.7+ en avril 2016. – AnneTheAgile

20

Que diriez-vous de cet algorithme? Diviser le texte sur les espaces, puis couper la ponctuation. Cela supprime soigneusement la ponctuation du bord des mots, sans nuire aux apostrophes à l'intérieur des mots tels que 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

Bien, mais certains mots anglais contiennent vraiment de la ponctuation. Par exemple, les points de fin dans "par exemple" et "Mrs.", et l'apostrophe de fuite dans les "grenouilles" possessives (comme dans les jambes de grenouilles) font partie du mot, mais seront dépouillés par cet algorithme. Le traitement correct des abréviations peut être obtenu * approximativement * en détectant des initialismes séparés par des points et en utilisant un dictionnaire de cas spéciaux (comme 'Mr.',' Mrs.'). Distinguer les apostrophes possessive des guillemets simples est considérablement plus difficile, car il faut analyser la grammaire de la phrase dans laquelle le mot est contenu. –

+2

@MarkAmery Vous avez raison. Il m'est également apparu que certaines marques de ponctuation, telles que l'em dash, peuvent séparer des mots sans espaces. –

+0

OMG! J'aime Python – Fandango68

10

shlex a une fonction .split(). Elle se distingue de str.split() en ce qu'elle ne conserve pas des citations et traite une phrase citée comme un seul mot:

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