2009-04-13 2 views
387

Я хочу, чтобы моя функция python разделила предложение (ввод) и сохранила каждое слово в списке. Код, который я написал до сих пор, разделяет предложение, но не сохраняет слова в виде списка. Как мне это сделать?Как разбить строку в список?

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

Какой часть этого кода не работает? Можете ли вы предоставить сообщение об ошибке или проблему, с которой вы сталкиваетесь? –

+2

Как бы то ни было, вы будете печатать полный список слов для каждого слова в списке. Я думаю, вы хотели использовать 'print (word)' в качестве вашей последней строки. – tgray

+19

Вопрос был отредактирован, чтобы включить правильный ответ, чтобы он больше не имел смысла – Joop

ответ

318
text.split() 

Этого должно быть достаточно, чтобы хранить каждое слово в списке. words уже является списком слов из предложения, поэтому нет необходимости в цикле.

Во-вторых, это может быть опечатка, но ваша петля немного перепутана. Если вы действительно хотите использовать Append, это было бы:

words.append(word) 

не

word.append(words) 
319

Разбивает строку на text на любые последовательные пробежки пробелов.

words = text.split()  

Разделить строку в text ограничителем: ",".

words = text.split(",") 

Переменная слова будет list и содержат слова из text разделения на разделитель.

66

str.split()

Вернуть список слов в строке, используя разделитель в качестве разделитель ... Если sep не указан или None, применяется другой алгоритм разделения: пробеги последовательных пробелов рассматриваются как один разделитель, и результат не будет содержать пустых строк в начале или в конце, если строка имеет ведущее или завершающее пробелы.

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

@warvariuc - должен быть связан с https://docs.python.org/2/library/stdtypes.html#str.split – gimel

2

Я думаю, что вы смущены из-за опечатки.

Заменить print(words) с print(word) внутри цикла, чтобы каждое слово, напечатанное на отдельной строке

13

Я хочу, чтобы моя функция питона, чтобы разделить предложение (вход) и хранить каждое слово в списке

метод str().split() делает это, он принимает строку, разбивает его в список:

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

Проблема у вас возникли из-за опечатки, Вы писали print(words) вместо print(word):

Переименование переменной word в current_word, это то, что у вас было:

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

..когда вы должны сделать:

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

Если по какой-то причине вы хотите, чтобы вручную создать список в цикл, вы бы использовать метод список append(), возможно потому, что вы хотите Строчные все слова (например,):

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

Или еще немного аккуратнее, используя list-comprehension:

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

в зависимости от того, что вы собираетесь делать с вашим предложением, как-списка, вы можете посмотрите на Natural Language Took Kit. Он в значительной степени занимается обработкой и оценкой текста. Вы также можете использовать его, чтобы решить вашу проблему:

import nltk 
words = nltk.word_tokenize(raw_sentence) 

Это добавочное преимущество разделения пунктуации.

Пример:

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

Это позволяет отфильтровать знаки препинания вы не хотите, и использовать только слова.

Обратите внимание, что другие решения, использующие string.split(), лучше, если вы не планируете выполнять какие-либо сложные манипуляции с рассылкой.

+4

'split()' полагается на пустое пространство как разделитель, поэтому он не сможет отделить дефисные слова - и фразы, разделенные длинной линией, также не будут разделены. И если предложение содержит любые знаки препинания без пробелов, они не будут придерживаться. Для любого реального синтаксического анализа текста (например, для этого комментария) ваше предложение nltk намного лучше, чем split() '. – hobs

+1

Потенциально полезный, хотя я бы не охарактеризовал это как разделение на «слова». По любым простым английским определением слова '','' и '' '' '' не являются словами. Обычно, если вы хотите разделить предложение выше на «слова» в знаке пунктуации, вам нужно разделить запятую и получить «лисицу» как «одно слово». –

+1

Python 2.7+ по состоянию на апрель 2016 года. – AnneTheAgile

20

Как насчет этого алгоритма? Разделите текст на пробелы, затем нарисуйте пунктуацию. Это тщательно удаляет пунктуацию с края слов, не нанося вреда апострофам внутри слов, таких как 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

Ницца, но некоторые английские слова действительно содержат прерывную пунктуацию. Например, конечные точки в «например» и «миссис» и конечный апостроф в притяжательных «лягушах» (как в «ногах лягушек») являются частью этого слова, но будут разделены этим алгоритмом. Правильная обработка аббревиатур может быть * грубо достигнута путем обнаружения разделенных точками инициализаций плюс использование словаря особых случаев (например, 'Mr.',' Mrs.'). Отличие притяжательных апострофов от одинарных кавычек значительно сложнее, поскольку для этого требуется разбор грамматики предложения, в котором содержится это слово. –

+2

@MarkAmery Вы правы. С тех пор мне пришло в голову, что некоторые знаки препинания, такие как em emash, могут отделять слова без пробелов. –

+0

OMG! Я люблю Python – Fandango68

10

shlex имеет .split() функцию. Она отличается от str.split() в том, что она не сохраняет кавычки и обрабатывает цитируемую фразу как одно слово:

>>> import shlex 
>>> shlex.split("sudo echo 'foo && bar'") 
['sudo', 'echo', 'foo && bar'] 
Смежные вопросы