2009-04-13 69 views
387

Tôi muốn hàm python của tôi phân tách một câu (đầu vào) và lưu trữ từng từ trong một danh sách. Mã mà tôi đã viết cho đến nay chia tách câu, nhưng không lưu trữ các từ như một danh sách. Làm thế nào để làm điều đó?Làm thế nào để tách một chuỗi thành một danh sách?

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

Phần nào của mã này không hoạt động? Bạn có thể cung cấp thông báo lỗi hoặc sự cố bạn đang gặp phải không? –

+2

Vì vậy, bạn sẽ in danh sách đầy đủ các từ cho mỗi từ trong danh sách. Tôi nghĩ bạn có ý định sử dụng 'print (word) 'làm dòng cuối cùng của bạn. – tgray

+19

Câu hỏi đã được chỉnh sửa để bao gồm câu trả lời chính xác để nó không có ý nghĩa nữa – Joop

Trả lời

318
text.split() 

Điều này là đủ để lưu trữ từng từ trong danh sách. words đã là danh sách các từ trong câu, do đó không cần vòng lặp.

Thứ hai, nó có thể là lỗi đánh máy, nhưng bạn có vòng lặp của bạn một chút sai lầm. Nếu bạn thực sự đã muốn sử dụng append, nó sẽ là:

words.append(word) 

không

word.append(words) 
319

Tách chuỗi trong text trên bất kỳ khoảng trắng liên tiếp nào.

words = text.split()  

Chia chuỗi trong text trên delimiter: ",".

words = text.split(",") 

Biến lời sẽ là một list và chứa các từ từ text chia trên delimiter.

66

str.split()

Return một danh sách các từ trong chuỗi, sử dụng tháng chín như delimiter ... Nếu không được chỉ định hoặc là Không, thuật toán tách khác được áp dụng: các khoảng trắng liên tiếp được coi là một dấu tách đơn, và kết quả sẽ không chứa các chuỗi trống ở đầu hoặc cuối nếu chuỗi có khoảng trắng đầu hoặc cuối.

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

@warvariuc - lẽ ra phải được liên kết với https://docs.python.org/2/library/stdtypes.html#str.split – gimel

2

Tôi nghĩ bạn đang bối rối vì lỗi đánh máy.

Thay print(words) với print(word) bên trong vòng lặp của bạn có từng chữ in trên một dòng khác nhau

13

Tôi muốn chức năng python của tôi để chia một câu (đầu vào) và lưu trữ mỗi từ trong một danh sách

Phương thức str().split() thực hiện điều này, phải mất một chuỗi, chia nhỏ nó thành một danh sách:

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

Vấn đề bạn đang gặp phải là do một lỗi đánh máy, bạn đã viết print(words) thay vì print(word):

Đổi tên biến word-current_word, đây là những gì bạn có:

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

..khi bạn nên làm:

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

Nếu vì một số lý do bạn muốn tự xây dựng một danh sách trong vòng lặp for, bạn sẽ sử dụng phương pháp danh sách append(), có lẽ vì bạn muốn giảm hợp cụ thể tất cả các từ (ví dụ):

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

Hoặc thêm một chút gọn gàng, sử dụng một list-comprehension:

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

Tùy thuộc vào những gì bạn định làm gì với câu-as-a-list của bạn, bạn có thể muốn nhìn vào Natural Language Took Kit. Nó đề cập rất nhiều đến việc xử lý văn bản và đánh giá. Bạn cũng có thể sử dụng nó để giải quyết vấn đề của mình:

import nltk 
words = nltk.word_tokenize(raw_sentence) 

Điều này có thêm lợi ích khi chia nhỏ dấu chấm câu.

Ví dụ:

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

này cho phép bạn lọc ra bất kỳ dấu chấm câu bạn không muốn và chỉ sử dụng ngôn từ.

Xin lưu ý rằng các giải pháp khác sử dụng string.split() sẽ tốt hơn nếu bạn không có kế hoạch thực hiện bất kỳ thao tác phức tạp nào đối với việc gửi.

+4

'split()' dựa trên khoảng trống trắng làm dấu tách, vì vậy nó sẽ không tách biệt các từ được gạch nối - và các cụm từ được phân tách bằng dấu gạch ngang dài sẽ không bị chia nhỏ. Và nếu câu có chứa dấu chấm câu không có dấu cách, câu đó sẽ không được gắn. Đối với bất kỳ phân tích cú pháp văn bản trong thế giới thực nào (như đối với nhận xét này), đề xuất nltk của bạn tốt hơn nhiều so với phân tách() '. – hobs

+1

Có khả năng hữu ích, mặc dù tôi sẽ không mô tả điều này như tách thành "từ". Theo bất kỳ định nghĩa tiếng Anh đơn giản nào, '','' và '" 's "không phải là từ. Thông thường, nếu bạn muốn chia câu trên thành "các từ" theo cách nhận biết dấu chấm câu, bạn muốn loại bỏ dấu phẩy và nhận '" con cáo "" như một từ duy nhất. –

+1

Python 2.7+ tính đến tháng 4 năm 2016. – AnneTheAgile

20

Thuật toán này như thế nào? Tách văn bản trên khoảng trắng, sau đó cắt dấu chấm câu. Thao tác này loại bỏ dấu chấm câu một cách cẩn thận khỏi cạnh của các từ, mà không làm tổn hại các dấu nháy trong các từ như 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

Rất tốt, nhưng một số từ tiếng Anh thực sự chứa dấu chấm câu. Ví dụ, các dấu chấm trong 'ví dụ' và' Bà', và dấu nháy đơn sau trong 'ếch 'sở hữu (giống như' chân ếch ') là một phần của từ, nhưng sẽ bị tước đi bởi thuật toán này. Xử lý chữ viết tắt một cách chính xác có thể được * xấp xỉ * đạt được bằng cách phát hiện các dấu phân tách bằng dấu chấm, cộng với sử dụng từ điển các trường hợp đặc biệt (như 'Mr.',' Mrs.'). Phân biệt các dấu nháy đơn sở hữu từ các dấu nháy đơn là khó khăn hơn, vì nó đòi hỏi phải phân tích cú pháp ngữ pháp của câu trong đó từ đó được chứa. –

+2

@MarkAmery Bạn nói đúng. Nó cũng kể từ khi xảy ra với tôi rằng một số dấu câu - chẳng hạn như dấu gạch ngang em — có thể tách các từ không có dấu cách. –

+0

OMG! Tôi yêu Python – Fandango68

10

shlex có chức năng .split(). Nó khác với str.split() ở chỗ nó không giữ lại dấu ngoặc kép và xử lý cụm từ được trích dẫn dưới dạng một từ:

>>> import shlex 
>>> shlex.split("sudo echo 'foo && bar'") 
['sudo', 'echo', 'foo && bar'] 
Các vấn đề liên quan