Как разбить строку в список?


574

Я хочу, чтобы моя функция 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(words)

1
Какая часть этого кода не работает? Можете ли вы предоставить сообщение об ошибке или возникшую проблему?
S.Lott

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

Ответы:


487
text.split()

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

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

words.append(word)

не

word.append(words)

447

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

words = text.split()      

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

words = text.split(",")   

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


86

str.split ()

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

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

@warvariuc - должны были связаны с docs.python.org/2/library/stdtypes.html#str.split
Гимел

52

В зависимости от того, что вы планируете делать со своим предложением в виде списка, вы можете посмотреть на 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()лучше использовать , если вы не планируете делать какие-либо сложные манипуляции с предложением.

[Изменено]


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

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

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

31

Как насчет этого алгоритма? Разделите текст на пустое место, затем обрежьте знаки препинания. Это тщательно удаляет пунктуацию с края слов, не нанося вреда апострофам внутри слов, таких как 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
Хорошо, но некоторые английские слова действительно содержат конечную пунктуацию. Например, конечные точки в e.g.и Mrs.и конечный апостроф в притяжательном frogs'(как в frogs' legs) являются частью слова, но этот алгоритм будет исключен. Корректная обработка аббревиатур может быть примерно достигнута путем обнаружения инициализмов, разделенных точками, и использования словаря особых случаев (например Mr., Mrs.) Различить притяжательные апострофы из одинарных кавычек значительно сложнее, так как требуется анализ грамматики предложения, в котором содержится слово.
Марк Амери

2
@MarkAmery Ты прав. Мне также пришло в голову, что некоторые знаки препинания, такие как «тире», могут разделять слова без пробелов.
Полковник Паник

16

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

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)

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

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

Или, более аккуратно, используя понимание списка :

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

12

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

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

10

Если вы хотите, чтобы все символы слова / предложения в списке, сделали это:

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


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

4

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.