Bagaimana cara membagi string menjadi daftar?


574

Saya ingin fungsi Python saya untuk membagi kalimat (input) dan menyimpan setiap kata dalam daftar. Kode saya saat ini membagi kalimat, tetapi tidak menyimpan kata-kata sebagai daftar. Bagaimana aku melakukan itu?

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
Bagian mana dari kode ini yang tidak berfungsi? Bisakah Anda memberikan pesan kesalahan atau masalah yang Anda hadapi?
S.Lott

4
Karena itu, Anda akan mencetak daftar kata lengkap untuk setiap kata dalam daftar. Saya pikir Anda bermaksud menggunakan print(word)sebagai baris terakhir Anda.
tgray

Jawaban:


487
text.split()

Ini harus cukup untuk menyimpan setiap kata dalam daftar. wordssudah daftar kata-kata dari kalimat, sehingga tidak perlu untuk loop.

Kedua, ini mungkin salah ketik, tetapi lingkaran Anda sedikit kacau. Jika Anda benar-benar ingin menggunakan append, itu akan menjadi:

words.append(word)

tidak

word.append(words)

447

Pisahkan string dalam textmenjalankan spasi kosong berurutan.

words = text.split()      

Membagi string di textatas pembatas: ",".

words = text.split(",")   

Variabel kata-kata adalah a listdan berisi kata-kata dari textsplit pada pembatas.


86

str.split ()

Kembalikan daftar kata-kata dalam string, menggunakan sep sebagai pembatas ... Jika sep tidak ditentukan atau tidak ada, algoritma pemisahan yang berbeda diterapkan: berjalan spasi spasi berturut-turut dianggap sebagai pemisah tunggal, dan hasilnya akan berisi tidak ada string kosong di awal atau akhir jika string memiliki spasi spasi awal atau akhir.

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

@warvariuc - seharusnya tertaut ke docs.python.org/2/library/stdtypes.html#str.split
gimel

52

Bergantung pada apa yang Anda rencanakan untuk dilakukan dengan kalimat sebagai daftar, Anda mungkin ingin melihat Natural Language Took Kit . Ini sangat berkaitan dengan pemrosesan teks dan evaluasi. Anda juga dapat menggunakannya untuk menyelesaikan masalah Anda:

import nltk
words = nltk.word_tokenize(raw_sentence)

Ini memiliki manfaat tambahan untuk mengeluarkan tanda baca.

Contoh:

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

Ini memungkinkan Anda untuk memfilter tanda baca apa pun yang tidak Anda inginkan dan hanya menggunakan kata-kata.

Harap perhatikan bahwa penggunaan solusi lain string.split()lebih baik jika Anda tidak berencana melakukan manipulasi kalimat yang rumit.

[Diedit]


5
split()bergantung pada white-space sebagai pemisah, sehingga akan gagal untuk memisahkan kata-kata yang ditulis dgn tanda penghubung - dan frasa yang dipisahkan dengan tanda hubung panjang akan gagal untuk terpecah juga. Dan jika kalimat itu mengandung tanda baca tanpa spasi, itu akan gagal untuk tetap. Untuk parsing teks dunia nyata (seperti untuk komentar ini), saran nltk Anda jauh lebih baik daripada split () `.
hobs

2
Berpotensi berguna, meskipun saya tidak akan mencirikan ini sebagai pemisahan menjadi "kata-kata". Dengan definisi bahasa Inggris yang jelas, ','dan "'s"bukan kata-kata. Biasanya, jika Anda ingin membagi kalimat di atas menjadi "kata-kata" dengan tanda baca-sadar, Anda ingin menghapus koma dan mendapatkan "fox's"sebagai kata tunggal.
Mark Amery

1
Python 2.7+ pada April 2016.
AnneTheAgile

31

Bagaimana dengan algoritma ini? Membagi teks pada spasi putih, lalu potong tanda baca. Ini dengan hati-hati menghilangkan tanda baca dari tepi kata-kata, tanpa merusak apostrof dalam kata-kata seperti 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
Bagus, tetapi beberapa kata bahasa Inggris benar-benar mengandung tanda baca tambahan. Sebagai contoh, titik-titik jejak di dalam e.g.dan Mrs., dan tanda titik tertinggal di posesif frogs'(seperti dalam frogs' legs) adalah bagian dari kata, tetapi akan dilucuti oleh algoritma ini. Menangani singkatan dengan benar dapat secara kasar dicapai dengan mendeteksi inisialisasi titik-terpisah ditambah menggunakan kamus kasus khusus (seperti Mr., Mrs.). Membedakan tanda kutip posesif dari kutipan tunggal secara dramatis lebih sulit, karena membutuhkan penguraian tata bahasa kalimat di mana kata itu terkandung.
Mark Amery

2
@MarkAmery Anda benar. Sejak itu juga terpikir oleh saya bahwa beberapa tanda baca — seperti tanda hubung em — dapat memisahkan kata-kata tanpa spasi.
Kolonel Panic

16

Saya ingin fungsi python saya untuk membagi kalimat (input) dan menyimpan setiap kata dalam daftar

The str().split()Metode melakukan hal ini, dibutuhkan string, membagi ke daftar:

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

Masalah yang Anda alami adalah karena kesalahan ketik, Anda menulis print(words)alih-alih print(word):

Mengganti nama wordvariabel menjadi current_word, inilah yang Anda miliki:

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

..when yang seharusnya Anda lakukan:

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

Jika karena alasan tertentu Anda ingin membuat daftar secara manual di loop for, Anda akan menggunakan append()metode daftar , mungkin karena Anda ingin huruf kecil semua kata (misalnya):

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

Atau lebih rapi, menggunakan daftar-pemahaman :

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

12

shlex memiliki .split()fungsi. Ini berbeda dari str.split()yang tidak mempertahankan kutipan dan memperlakukan frase yang dikutip sebagai satu kata:

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

10

Jika Anda ingin semua karakter kata / kalimat dalam daftar, lakukan ini:

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


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

4

Saya pikir Anda bingung karena kesalahan ketik.

Ganti print(words)dengan print(word)di dalam lingkaran Anda untuk setiap kata dicetak pada baris yang berbeda

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.