Jak podzielić ciąg na listę?

574

Chcę, aby moja funkcja Python podzieliła zdanie (wejście) i zapisała każde słowo na liście. Mój obecny kod dzieli zdanie, ale nie przechowuje słów jako listy. Jak mogę to zrobić?

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)
Dzięki
źródło
1
Która część tego kodu nie działa? Czy możesz podać komunikat o błędzie lub problem, który masz?
S.Lott,
4
W tej chwili będziesz drukować pełną listę słów dla każdego słowa na liście. Myślę, że chciałeś użyć print(word)jako swojej ostatniej linii.
tgray 13.04.2009

Odpowiedzi:

487
text.split()

To powinno wystarczyć do zapisania każdego słowa na liście. wordsjest już listą słów z zdania, więc pętla nie jest potrzebna.

Po drugie, może to być literówka, ale twoja pętla jest trochę pomieszana. Jeśli naprawdę chcesz użyć append, byłoby to:

words.append(word)

nie

word.append(words)
nstehr
źródło
447

Dzieli ciąg znaków textna dowolne kolejne serie białych znaków.

words = text.split()      

Podzielić ciąg w textseparatora: ",".

words = text.split(",")   

Zmienna słów będzie miała wartość a listi będzie zawierać słowa z textpodziału na separatorze.

zalew
źródło
86

str.split ()

Zwraca listę słów w ciągu, używając sep jako separatora ... Jeśli sep nie jest określony lub ma wartość None, stosowany jest inny algorytm podziału: przebiegi kolejnych białych znaków są traktowane jako pojedynczy separator, a wynik będzie zawierał brak pustych ciągów na początku lub na końcu, jeśli ciąg ma wiodące lub końcowe białe znaki.

>>> line="a sentence with a few words"
>>> line.split()
['a', 'sentence', 'with', 'a', 'few', 'words']
>>> 
gimel
źródło
@warvariuc - powinien mieć link do docs.python.org/2/library/stdtypes.html#str.split
gimel
52

W zależności od tego, co planujesz zrobić z listą zdań, możesz zajrzeć do zestawu Natural Language Took Kit . Zajmuje się głównie przetwarzaniem i oceną tekstu. Możesz go również użyć do rozwiązania problemu:

import nltk
words = nltk.word_tokenize(raw_sentence)

Ma to dodatkową zaletę polegającą na rozdzielaniu interpunkcji.

Przykład:

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

Pozwala to odfiltrować niepotrzebne znaki interpunkcyjne i używać tylko słów.

Pamiętaj, że inne stosowane rozwiązania string.split()są lepsze, jeśli nie planujesz wykonywać skomplikowanych manipulacji zdaniem.

[Edytowane]

Tray
źródło
5
split()opiera się na spacji jako separatorze, więc nie będzie w stanie oddzielić dzielonych wyrazów - a frazy oddzielone długim myślnikiem również się nie podzielą. A jeśli zdanie zawiera interpunkcję bez spacji, nie będą się one trzymać. Dla każdego parsowania tekstu w świecie rzeczywistym (jak w przypadku tego komentarza) twoja sugestia nltk jest znacznie lepsza niż split () `.
płyty grzejne
2
Potencjalnie przydatne, chociaż nie scharakteryzowałbym tego jako dzielenie na „słowa”. Według jakiejkolwiek prostej angielskiej definicji ','i "'s"nie są słowami. Zwykle, jeśli chcesz podzielić powyższe zdanie na „słowa” w sposób rozpoznający interpunkcję, możesz usunąć przecinek i otrzymać "fox's"jedno słowo.
Mark Amery
1
Python 2.7+ od kwietnia 2016 r.
AnneTheAgile
31

Co powiesz na ten algorytm? Podziel tekst na białe znaki, a następnie przycinaj znaki interpunkcyjne. To ostrożnie usuwa interpunkcję z krawędzi słów, nie szkodząc apostrofom w słowach takich jak 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']
Pułkownik Panika
źródło
4
Fajnie, ale niektóre angielskie słowa naprawdę zawierają końcowe znaki interpunkcyjne. Na przykład końcowe kropki do e.g.i Mrs.apostrof końcowy w dzierżawczym frogs'(jak w frogs' legs) są częścią słowa, ale zostaną usunięte przez ten algorytm. Obchodzenie skróty właściwie może być w przybliżeniu uzyskuje się poprzez wykrywanie kropka oddziela initialisms oraz przy użyciu słownika szczególnych przypadkach (jak Mr., Mrs.). Odróżnianie apostrofów dzierżawczych od pojedynczych cudzysłowów jest znacznie trudniejsze, ponieważ wymaga analizy gramatyki zdania, w którym słowo jest zawarte.
Mark Amery
2
@MarkAmery Masz rację. Odtąd przyszło mi do głowy, że niektóre znaki interpunkcyjne - takie jak myślnik - mogą rozdzielać słowa bez spacji.
Pułkownik Panic
16

Chcę, aby moja funkcja python podzieliła zdanie (wejście) i zapisała każde słowo na liście

str().split()Sposób to robi, że ma ciąg, dzieli go na listę:

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

Problem, który masz, to literówka, którą napisałeś print(words)zamiast print(word):

Zmieniając nazwę wordzmiennej na current_word, właśnie to:

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

... kiedy powinieneś zrobić:

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

Jeśli z jakiegoś powodu chcesz ręcznie utworzyć listę w pętli for, skorzystaj z append()metody list , być może dlatego, że chcesz małe litery wszystkich słów (na przykład):

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

Lub bardziej schludnie, używając zrozumienia listy :

my_list = [current_word.lower() for current_word in words]
dbr
źródło
12

shlex ma .split()funkcję. Różni się str.split()tym, że nie zachowuje cudzysłowów i traktuje cytowane wyrażenie jako pojedyncze słowo:

>>> import shlex
>>> shlex.split("sudo echo 'foo && bar'")
['sudo', 'echo', 'foo && bar']
Tarwin
źródło
10

Jeśli chcesz mieć wszystkie znaki słowa / zdania na liście, wykonaj następujące czynności:

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


print(list("some sentence"))
#  ['s', 'o', 'm', 'e', ' ', 's', 'e', 'n', 't', 'e', 'n', 'c', 'e']
Czarnobrody
źródło
4

Myślę, że jesteś zdezorientowany z powodu literówki.

Wymień print(words)się print(word)wewnątrz pętli, że każde słowo drukowane na innej linii

Aditya Mukherji
źródło