Як розділити рядок на список?


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- це вже перелік слів із речення, тому в циклі немає потреби.

По-друге, це може бути помилка друку, але у вас петля трохи переплутана. Якщо ви дійсно хочете використовувати додаток, це було б:

words.append(word)

ні

word.append(words)

447

Розбиває рядок textна будь-які послідовні пробіли пробілів.

words = text.split()      

Розділити рядок в textобмежувачі: ",".

words = text.split(",")   

Змінна слів буде a listі міститиме слова від textрозділення на роздільнику.


86

str.split ()

Поверніть список слів у рядку, використовуючи sep як роздільник ... Якщо sep не вказаний або немає, застосовується інший алгоритм розщеплення: прогони послідовних пробілів розглядаються як єдиний роздільник, і результат буде містити немає пустих рядків на початку або в кінці, якщо рядок має провідну або кінцеву пробіли.

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

52

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

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()метод списку , можливо, тому, що ви хочете, щоб усі слова (наприклад) були малі)

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

shlex має .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.