2009-04-13 9 views
387

Chcę, aby moja funkcja python podzielić zdanie (wejście) i przechowywać każde słowo na liście. Kod, który napisałem do tej pory dzieli zdanie, ale nie zapisuje słów jako listy. Jak mogę to zrobić?Jak podzielić ciąg na listę?

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

Jaka część tego kodu nie działa? Czy możesz podać komunikat o błędzie lub problem, który masz? –

+2

W takim przypadku będziesz drukować pełną listę słów dla każdego słowa na liście. Myślę, że zamierzałeś użyć 'print (word)' jako swojej ostatniej linii. – tgray

+19

Pytanie zostało zmodyfikowane, aby zawierało poprawną odpowiedź, więc nie ma już sensu. – Joop

Odpowiedz

318
text.split() 

Powinno wystarczyć do zapisania każdego słowa na liście. words jest już listą słów ze zdania, więc nie ma potrzeby pętli.

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

words.append(word) 

nie

word.append(words) 
319

Dzieli napis w text na dowolnych kolejnych przebiegach białych znaków.

words = text.split()  

podzielić ciąg w text separatora: ",".

words = text.split(",") 

Zmienna słowa będzie list i zawierają słowa z pęknięciem na text ogranicznika.

66

str.split()

zwrócić lista słów w łańcuchu, używając sie jako separator ... Jeśli parametr sep nie jest określony lub jest Brak, stosowany jest inny algorytm podziału: przebiegi kolejnych białych znaków są traktowane jako pojedynczy separator, i wynik nie będzie zawierał 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'] 
>>> 
+0

@warvariuc - powinien mieć link do https://docs.python.org/2/library/stdtypes.html#str.split – gimel

2

myślę, że są zdezorientowani z powodu literówki.

Wymień print(words) z print(word) wewnątrz pętli mieć każde słowo drukowane na innej linii

13

Chcę moje funkcja python podzielić zdanie (wejście) i zapisać każde słowo w liście

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

>>> 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 masz z powodu literówki, napisałeś print(words) zamiast print(word):

Zmiana nazwy zmiennej word do current_word, to jest to, co miał:

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

..kiedy należy zrobić:

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

Jeśli z jakiegoś powodu chcesz ręcznie skonstruować listę w pętli, należy użyć metody lista append(), być może dlatego, że chcesz małymi wszystkich słów (na przykład):

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

Albo bardziej nieco schludniej, stosując list-comprehension:

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

w zależności od tego, co zamierzasz zrobić ze swoim zdanie-as-a-listy, może chcesz spójrz na 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 dzieleniu 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', '.'] 

To pozwala odfiltrować znaki interpunkcyjne, których nie chcesz i używać tylko słowa.

Należy pamiętać, że inne rozwiązania korzystające z string.split() są lepsze, jeśli nie planuje się skomplikowanej manipulacji sentencją.

+4

'split()' opiera się na białej przestrzeni jako separatorze, więc nie będzie się oddzielał słowa dzielone - i rozdzielone frazy długo-kreskowe również nie będą się dzielić. A jeśli zdanie zawiera jakąkolwiek interpunkcję bez spacji, te nie będą się trzymać. Dla dowolnego parsowania tekstu w świecie rzeczywistym (jak w przypadku tego komentarza) twoja sugestia nltk jest znacznie lepsza niż split() '. – hobs

+1

Potencjalnie użyteczny, chociaż nie scharakteryzowałbym tego jako podziału na "słowa". Według dowolnej zwykłej angielskiej definicji słowa "," i "" "nie są słowami. Normalnie, jeśli chcesz podzielić powyższe zdanie na "słowa" w sposób uwzględniający interpunkcje, należy rozdzielić przecinek i uzyskać "" lis "jako pojedyncze słowo. –

+1

Python 2.7+ od kwietnia 2016 r. – AnneTheAgile

20

Co z tym algorytmem? Podziel tekst na białe znaki, a następnie przycinaj znaki interpunkcyjne. Ostrożnie usuwa interpunkcje z krawędzi słów, nie uszkadzając apostrofów 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'] 
+2

Fajnie, ale niektóre angielskie słowa naprawdę zawierają ciągłe znaki interpunkcyjne. Na przykład, końcowe kropki w 'np.' I 'Mrs.' i ciągnący się apostrof w dzierżawczym' żabiu'' (jak w 'nogach żabich') są częścią tego słowa, ale zostaną usunięte przez ten algorytm. Właściwe posługiwanie się skrótami może być * w przybliżeniu * osiągnięte poprzez wykrycie początkowo oddzielonych kropkami inicjalizmu oraz użycie słownika specjalnych przypadków (takich jak 'Mr.',' Mrs.'). Rozróżnianie apostrofów dzierżawczych z pojedynczych cudzysłowów jest znacznie trudniejsze, ponieważ wymaga przeanalizowania gramatyki zdania, w którym zawarte jest słowo. –

+2

@MarkAmery Masz rację. Od tego czasu przyszło mi do głowy, że niektóre znaki interpunkcyjne - takie jak em-kreska - mogą oddzielać słowa bez spacji. –

+0

OMG! Uwielbiam Python – Fandango68

10

shlex ma .split() funkcję. Różni się on od str.split() w tym, że nie zachowuje cytaty i traktuje kwotowań frazę jako jedno słowo:

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