Comment diviser une chaîne en liste?

574

Je veux que ma fonction Python divise une phrase (entrée) et stocke chaque mot dans une liste. Mon code actuel divise la phrase, mais ne stocke pas les mots sous forme de liste. Comment je fais ça?

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)
Thanx
la source
1
Quelle partie de ce code ne fonctionne pas? Pouvez-vous fournir le message d'erreur ou le problème que vous rencontrez?
S.Lott
4
En l'état, vous imprimerez 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

Réponses:

487
text.split()

Cela devrait être suffisant pour stocker chaque mot dans une liste. wordsest déjà une liste des mots de la phrase, il n'y a donc pas besoin de la boucle.

Deuxièmement, ce pourrait être une faute de frappe, mais votre boucle est un peu fouillie. Si vous vouliez vraiment utiliser append, ce serait:

words.append(word)

ne pas

word.append(words)
nstehr
la source
447

Fractionne la chaîne textsur toutes les séquences consécutives d'espaces.

words = text.split()      

Diviser la chaîne dans textle delimiter: ",".

words = text.split(",")   

La variable mots sera a listet contiendra les mots de textsplit sur le délimiteur.

zalew
la source
86

str.split ()

Renvoie une liste des mots de la chaîne, en utilisant sep comme délimiteur ... Si sep n'est pas spécifié ou est Aucun, un algorithme de fractionnement différent est appliqué: les exécutions d'espaces consécutifs sont considérées comme un seul séparateur, et le résultat contiendra pas de chaînes vides au début ou à la fin si la chaîne a un espace de début ou de fin.

>>> line="a sentence with a few words"
>>> line.split()
['a', 'sentence', 'with', 'a', 'few', 'words']
>>> 
gimel
la source
@warvariuc - aurait dû être lié à docs.python.org/2/library/stdtypes.html#str.split
gimel
52

Selon ce que vous prévoyez de faire avec votre phrase sous forme de liste, vous voudrez peut-être consulter le Kit de langage naturel . Il traite fortement du traitement et de l'évaluation du texte. 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 fractionner 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 toute ponctuation dont vous ne voulez pas et d'utiliser uniquement des mots.

Veuillez noter que les autres solutions utilisant string.split()sont meilleures si vous ne prévoyez pas de faire une manipulation complexe de la phrase.

[Édité]

tgray
la source
5
split()s'appuie sur un espace blanc comme séparateur, il ne parviendra donc pas à séparer les mots avec trait d'union - et les phrases séparées par des tirets longs ne se sépareront pas également. Et si la phrase contient une ponctuation sans espaces, ceux-ci ne colleront pas. Pour toute analyse de texte du monde réel (comme pour ce commentaire), votre suggestion nltk est bien meilleure que split () `.
plaques de cuisson
2
Potentiellement utile, bien que je ne qualifierais pas cela de se diviser en "mots". Par toute définition anglaise simple, ','et "'s"ne sont pas des mots. Normalement, si vous souhaitez diviser la phrase ci-dessus en "mots" d'une manière sensible à la ponctuation, vous voudrez supprimer la virgule et obtenir "fox's"un seul mot.
Mark Amery
1
Python 2.7+ en avril 2016.
AnneTheAgile
31

Et cet algorithme? Fractionnez le texte sur un espace, puis coupez la ponctuation. Cela supprime soigneusement la ponctuation du bord des mots, sans nuire aux apostrophes à l'intérieur de 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']
Colonel Panic
la source
4
Bien, mais certains mots anglais contiennent vraiment une ponctuation finale. Par exemple, les points de fin dans e.g.et Mrs.et l'apostrophe de fin dans le possessif frogs'(comme dans frogs' legs) font partie du mot, mais seront supprimés par cet algorithme. Les abréviations bon déroulement peuvent être plus ou moins atteints par la détection de sigles de points séparés , plus en utilisant un dictionnaire de cas particuliers (comme Mr., Mrs.). Il est beaucoup plus difficile de distinguer les apostrophes possessives des guillemets simples, car cela nécessite d'analyser la grammaire de la phrase dans laquelle le mot est contenu.
Mark Amery
2
@MarkAmery Vous avez raison. Il m'est également venu à l'esprit que certains signes de ponctuation, tels que le tiret cadratin, peuvent séparer les mots sans espaces.
Colonel Panic
16

Je veux que ma fonction python divise une phrase (entrée) et stocke chaque mot dans une liste

La str().split()méthode fait cela, elle prend une chaîne, la 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 dû à une faute de frappe, vous avez écrit print(words)au lieu deprint(word) :

En renommant la wordvariable current_word, voici 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 souhaitez construire manuellement une liste dans la boucle for, vous utiliserez la append()méthode list , peut-être parce que vous voulez mettre en minuscule 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 net, en utilisant une liste de compréhension :

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

shlex a une .split()fonction. Il diffère du str.split()fait qu'il ne conserve pas les guillemets et traite une phrase citée comme un seul mot:

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

Si vous voulez tous les caractères d'un mot / phrase dans une liste, procédez comme suit:

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


print(list("some sentence"))
#  ['s', 'o', 'm', 'e', ' ', 's', 'e', 'n', 't', 'e', 'n', 'c', 'e']
Blackeard
la source
4

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

Remplacez-le print(words)par l' print(word)intérieur de votre boucle pour que chaque mot soit imprimé sur une ligne différente

Aditya Mukherji
la source