Làm thế nào để tách một chuỗi thành một danh sách?


574

Tôi muốn hàm Python của mình tách một câu (đầu vào) và lưu trữ từng từ trong danh sách. Mã hiện tại của tôi phân tách câu, nhưng không lưu trữ các từ dưới dạng danh sách. Làm thế nào để làm điều đó?

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
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 vấn đề bạn đang gặp phải không?
S.Lott

4
Như 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ó nghĩa là sử dụng print(word)như là dòng cuối cùng của bạn.
tgray

Câu trả lời:


487
text.split()

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

Thứ hai, nó có thể là một lỗi đánh máy, nhưng bạn có một vòng lặp hơi lộn xộn. Nếu bạn thực sự muốn sử dụng nối thêm, nó sẽ là:

words.append(word)

không phải

word.append(words)

447

Chia chuỗi trong textbất kỳ lần chạy liên tiếp nào của khoảng trắng.

words = text.split()      

Chia chuỗi trong textdấu phân cách : ",".

words = text.split(",")   

Biến từ sẽ là a listvà chứa các từ được textphân tách trên dấu phân cách.


86

str.split ()

Trả về danh sách các từ trong chuỗi, sử dụng sep làm dấu phân cách ... Nếu sep không được chỉ định hoặc là Không có, thuật toán phâ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 duy nhất và kết quả sẽ chứa không 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']
>>> 

@warvariuc - nên đã liên kết để docs.python.org/2/library/stdtypes.html#str.split
gimel

52

Tùy thuộc vào những gì bạn dự định làm với danh sách câu của bạn, bạn có thể muốn xem Bộ công cụ ngôn ngữ tự nhiên . Nó liên quan nhiều đến việc xử lý và đánh giá văn bản. 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 của việc tách dấu chấm câu.

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

Điều này cho phép bạn lọc ra bất kỳ dấu câu nào bạn không muốn và chỉ sử dụng các 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 của câu.

[Đã chỉnh sửa]


5
split()phụ thuộc vào khoảng trắng làm dấu phân cách, do đó, nó sẽ thất bại trong việc tách 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 cũng sẽ không được phân tách. Và nếu câu chứa bất kỳ dấu câu nào mà không có dấu cách, những câu đó sẽ không thành công. Đối với bất kỳ phân tích văn bản trong thế giới thực (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 split () `.
hobs

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

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

31

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

4
Đẹp, nhưng một số từ tiếng Anh thực sự có dấu chấm câu. Ví dụ, các dấu chấm trong e.g.Mrs.dấu nháy đơn trong phần sở hữu frogs'(như trong frogs' legs) là một phần của từ, nhưng sẽ bị tước bởi thuật toán này. Xử lý các chữ viết tắt một cách chính xác có thể đạt được một cách đại khái bằng cách phát hiện các chữ viết tắt được 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 dấu nháy đơn sở hữu từ dấu ngoặc đơn là khó hơn đáng kể, vì nó yêu cầu phân tích ngữ pháp của câu trong đó từ đó được chứa.
Đánh dấu Amery

2
@MarkAmery Bạn nói đúng. Kể từ đó, tôi cũng nhận ra rằng một số dấu chấm câu, ví dụ như dấu gạch ngang có thể tách các từ mà không có dấu cách.
Đại tá hoảng loạn

16

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

Các str().split()phương pháp thực hiện điều này, phải mất một chuỗi, chia tách 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 gặp phải là do lỗi đánh máy, bạn đã viết print(words)thay vì print(word):

Đổi tên wordbiến thành 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 nào bạn nên làm:

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

Nếu vì lý do nào đó bạn muốn xây dựng một danh sách theo cách thủ công trong vòng lặp for, bạn sẽ sử dụng append()phương thức danh sách , có lẽ vì bạn muốn viết thường 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 gọn gàng hơn một chút, sử dụng cách hiểu danh sách :

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

12

shlex.split()chức năng. Nó khác với str.split()ở chỗ nó không lưu giữ các trích dẫn và coi một cụm từ được trích dẫn là một từ duy nhất:

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

10

Nếu bạn muốn tất cả các ký tự của một từ / câu trong danh sách, hãy làm điều này:

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


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

4

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

Thay thế print(words)bằng print(word)bên trong vòng lặp của bạn để mỗi từ được in trên một dòng khác nhau

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.