文字列をリストに分割する方法は?


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

4
このまま、リスト内の各単語の完全な単語リストを印刷します。print(word)最終行として使うつもりだったと思います。
tgray 2009

回答:


487
text.split()

これは、各単語をリストに格納するのに十分なはずです。 wordsはすでに文の単語のリストなので、ループは必要ありません。

第二に、それはタイプミスかもしれませんが、ループが少し台無しになっています。本当に追加を使用したい場合は、次のようになります。

words.append(word)

ない

word.append(words)

447

text連続する空白の実行で文字列を分割します。

words = text.split()      

文字列textを区切り文字で分割します:","

words = text.split(",")   

words変数はaにlistなりtext、区切り文字で分割された単語が含まれます。


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

list-as-a-listをどのように使用するかによっては、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つの単語として取得します。
Mark Amery

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.所有格の末尾のアポストロフィは単語の一部ですが、このアルゴリズムによって削除されます。取り扱いの略語を正しくすることができるドットで区切らINITIALISMS検出プラス(のような特殊なケースの辞書を使用することによって達成さ、)。所有格のアポストロフィを単一引用符から区別することは、単語が含まれる文の文法を解析する必要があるため、劇的に困難です。frogs'frogs' legsMr.Mrs.
Mark Amery 2016年

2
@MarkAmeryそうですね。また、いくつかの句読点(emダッシュなど)がスペースなしで単語を区切ることができるようになったのもその後、私には思い当たりました。
大佐パニック

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

shlexには.split()機能があります。str.split()引用符を保持せず、引用符で囲まれた語句を1つの単語として扱うという点が異なります。

>>> 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)、すべての単語が別の行に出力されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.