Wie teile ich einen String in eine Liste auf?


574

Ich möchte, dass meine Python-Funktion einen Satz (Eingabe) teilt und jedes Wort in einer Liste speichert. Mein aktueller Code teilt den Satz, speichert die Wörter jedoch nicht als Liste. Wie mache ich das?

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)

1
Welcher Teil dieses Codes funktioniert nicht? Können Sie die Fehlermeldung oder das Problem angeben, das Sie haben?
S.Lott

4
So wie es ist, drucken Sie die vollständige Liste der Wörter für jedes Wort in der Liste. Ich denke, Sie wollten print(word)als letzte Zeile verwenden.
Tgray

Antworten:


487
text.split()

Dies sollte ausreichen, um jedes Wort in einer Liste zu speichern. wordsist bereits eine Liste der Wörter aus dem Satz, so dass die Schleife nicht erforderlich ist.

Zweitens könnte es ein Tippfehler sein, aber Sie haben Ihre Schleife ein wenig durcheinander. Wenn Sie wirklich append verwenden wollten, wäre es:

words.append(word)

nicht

word.append(words)

447

Teilt die Zeichenfolge in textaufeinanderfolgende Leerzeichenläufe auf.

words = text.split()      

Teilen Sie die Zeichenfolge textam Trennzeichen auf : ",".

words = text.split(",")   

Die Wortvariable ist a listund enthält die Wörter aus dem textgeteilten Trennzeichen.


86

str.split ()

Gibt eine Liste der Wörter in der Zeichenfolge zurück, wobei sep als Trennzeichen verwendet wird. Wenn sep nicht angegeben ist oder None ist, wird ein anderer Aufteilungsalgorithmus angewendet: Läufe aufeinanderfolgender Leerzeichen werden als einzelnes Trennzeichen betrachtet, und das Ergebnis enthält Keine leeren Zeichenfolgen am Anfang oder Ende, wenn die Zeichenfolge führende oder nachfolgende Leerzeichen enthält.

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


52

Je nachdem, was Sie mit Ihrem Satz als Liste vorhaben, sollten Sie sich das Natural Language Took Kit ansehen . Es befasst sich stark mit Textverarbeitung und Auswertung. Sie können es auch verwenden, um Ihr Problem zu lösen:

import nltk
words = nltk.word_tokenize(raw_sentence)

Dies hat den zusätzlichen Vorteil, dass Interpunktion aufgeteilt wird.

Beispiel:

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

Auf diese Weise können Sie nicht gewünschte Interpunktion herausfiltern und nur Wörter verwenden.

Bitte beachten Sie, dass die anderen verwendeten Lösungen string.split()besser sind, wenn Sie keine komplexe Manipulation des Satzes planen.

[Bearbeitet]


5
split()stützt sich auf Leerzeichen als Trennzeichen, sodass keine getrennten Wörter getrennt werden können - und durch lange Striche getrennte Phrasen können auch nicht getrennt werden. Und wenn der Satz eine Interpunktion ohne Leerzeichen enthält, bleiben diese nicht haften. Für jede reale Textanalyse (wie für diesen Kommentar) ist Ihr nltk-Vorschlag viel besser als split () `.
Kochfelder

2
Potenziell nützlich, obwohl ich dies nicht als Aufteilung in "Wörter" charakterisieren würde. Nach jeder einfachen englischen Definition ','und "'s"sind keine Wörter. Wenn Sie den obigen Satz interpunktionsbewusst in "Wörter" aufteilen möchten, möchten Sie normalerweise das Komma entfernen und "fox's"als einzelnes Wort erhalten.
Mark Amery

1
Python 2.7+ ab April 2016.
AnneTheAgile

31

Wie wäre es mit diesem Algorithmus? Teilen Sie Text auf Leerzeichen und schneiden Sie dann die Interpunktion. Dadurch wird die Interpunktion sorgfältig vom Rand der Wörter entfernt, ohne dass Apostrophe in Wörtern wie z 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']

4
Schön, aber einige englische Wörter enthalten wirklich nachgestellte Interpunktion. Zum Beispiel sind die nachfolgenden Punkte in e.g.und Mrs.und der nachfolgende Apostroph im Possessiv frogs'(wie in frogs' legs) Teil des Wortes, werden jedoch durch diesen Algorithmus entfernt. Handhabungs Abkürzungen korrekt werden grob durch Erfassen Punkte getrennten initialisms erreicht und ein Wörterbuch von Spezialfällen verwendet (wie Mr., Mrs.). Das Unterscheiden von Possessivapostrophen von einfachen Anführungszeichen ist dramatisch schwieriger, da die Grammatik des Satzes, in dem das Wort enthalten ist, analysiert werden muss.
Mark Amery

2
@ MarkAmery Du hast recht. Seitdem ist mir auch aufgefallen, dass einige Satzzeichen - wie der Bindestrich - Wörter ohne Leerzeichen trennen können.
Colonel Panic

16

Ich möchte, dass meine Python-Funktion einen Satz (Eingabe) teilt und jedes Wort in einer Liste speichert

Die str().split()Methode führt dies aus, nimmt eine Zeichenfolge und teilt sie in eine Liste auf:

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

Das Problem, das Sie haben, ist ein Tippfehler, den Sie geschrieben haben, print(words)anstatt print(word):

Wenn Sie die wordVariable in umbenennen current_word, haben Sie Folgendes:

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

..wenn Sie hätten tun sollen:

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

Wenn Sie aus irgendeinem Grund eine Liste in der for-Schleife manuell erstellen möchten, verwenden Sie die append()Listenmethode, möglicherweise weil Sie alle Wörter (zum Beispiel) in Kleinbuchstaben schreiben möchten:

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

Oder eher ein bisschen ordentlicher, mit einem Listenverständnis :

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

12

Shlex hat eine .split()Funktion. Es unterscheidet sich davon, str.split()dass es keine Anführungszeichen beibehält und eine zitierte Phrase als ein einziges Wort behandelt:

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

10

Wenn Sie alle Zeichen eines Wortes / Satzes in einer Liste haben möchten , gehen Sie folgendermaßen vor:

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


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

4

Ich denke, Sie sind wegen eines Tippfehlers verwirrt.

Ersetzen Sie print(words)durch print(word)innerhalb Ihrer Schleife, damit jedes Wort in einer anderen Zeile gedruckt wird

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.