Como dividir uma string em uma lista?

574

Quero que minha função Python divida uma frase (entrada) e armazene cada palavra em uma lista. Meu código atual divide a frase, mas não armazena as palavras como uma lista. Como faço isso?

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)
Thanx
fonte
1
Qual parte deste código não funciona? Você pode fornecer a mensagem de erro ou o problema que está tendo?
S.Lott
4
Como está, você imprimirá a lista completa de palavras para cada palavra da lista. Eu acho que você pretendia usar print(word)como sua última linha.
tgray 13/04/09

Respostas:

487
text.split()

Isso deve ser suficiente para armazenar cada palavra em uma lista. wordsjá é uma lista das palavras da frase, portanto não há necessidade do loop.

Segundo, pode ser um erro de digitação, mas você tem um pouco de confusão. Se você realmente quisesse usar o anexo, seria:

words.append(word)

não

word.append(words)
nstehr
fonte
447

Divide a string em texttodas as execuções consecutivas de espaço em branco.

words = text.split()      

Dividir a string em textno delimitador: ",".

words = text.split(",")   

A variável words será ae listconterá as palavras da textdivisão no delimitador.

zalew
fonte
86

str.split ()

Retorne uma lista das palavras na string, usando sep como delimitador ... Se sep não for especificado ou for None, um algoritmo de divisão diferente será aplicado: execuções de espaços em branco consecutivos são consideradas como um único separador e o resultado conterá nenhuma sequência vazia no início ou no final se a sequência tiver espaços em branco à esquerda ou à direita.

>>> line="a sentence with a few words"
>>> line.split()
['a', 'sentence', 'with', 'a', 'few', 'words']
>>> 
gimel
fonte
@warvariuc - deveria ter um link
gimel
52

Dependendo do que você planeja fazer com sua frase como lista, convém consultar o Kit de Tomo de Linguagem Natural . Ele lida fortemente com o processamento e avaliação de texto. Você também pode usá-lo para resolver seu problema:

import nltk
words = nltk.word_tokenize(raw_sentence)

Isso tem o benefício adicional de dividir a pontuação.

Exemplo:

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

Isso permite filtrar qualquer pontuação que você não deseja e usar apenas palavras.

Observe que as outras soluções utilizadas string.split()são melhores se você não planeja manipular complexa a frase.

[Editado]

tgray
fonte
5
split()depende do espaço em branco como separador, portanto, ele não consegue separar as palavras hifenizadas - e as frases separadas por traços longos também não conseguem se dividir. E se a sentença contiver alguma pontuação sem espaços, eles não serão atendidos. Para qualquer análise de texto do mundo real (como para este comentário), sua sugestão nltk é muito melhor que split () `.
hobs
2
Potencialmente útil, embora eu não caracterizasse isso como uma divisão em "palavras". Por qualquer definição simples em inglês, ','e "'s"não são palavras. Normalmente, se você quiser dividir a frase acima em "palavras" de maneira sensível à pontuação, retire a vírgula e obtenha "fox's"uma única palavra.
Mark Amery
1
Python 2.7+ em abril de 2016.
AnneTheAgile 20/16
31

E esse algoritmo? Divida o texto em espaço em branco e apare a pontuação. Isso remove cuidadosamente a pontuação da borda das palavras, sem prejudicar apóstrofos dentro de palavras como 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']
Coronel Panic
fonte
4
Bom, mas algumas palavras em inglês realmente contêm pontuação à direita. Por exemplo, os pontos finais em e.g.e Mrs., e o apóstrofo final no possessivo frogs'(como em frogs' legs) fazem parte da palavra, mas serão removidos por esse algoritmo. Abreviaturas corretamente tratamento pode ser mais ou menos conseguida através da detecção initialisms separados por pontos mais usando um dicionário de casos especiais (como Mr., Mrs.). Distinguir apóstrofos possessivos de aspas simples é muito mais difícil, pois exige a análise da gramática da sentença na qual a palavra está contida.
Mark Amery
2
@MarkAmery Você está certo. Também me ocorreu que alguns sinais de pontuação - como o traço - podem separar palavras sem espaços.
Coronel Panic
16

Quero que minha função python divida uma frase (entrada) e armazene cada palavra em uma lista

O str().split()método faz isso, pega uma string e a divide em uma lista:

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

O problema que você está tendo é devido a um erro de digitação, que você escreveu em print(words)vez de print(word):

Renomeando a wordvariável para current_word, é isso que você tinha:

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

..quando você deveria ter feito:

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

Se, por algum motivo, você deseja construir manualmente uma lista no loop for, você usaria o append()método list , talvez porque queira minúsculas todas as palavras (por exemplo):

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

Ou mais um pouco mais limpo, usando uma lista de compreensão :

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

shlex tem uma .split()função. Difere de str.split()não preservar aspas e tratar uma frase citada como uma única palavra:

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

Se você quiser todos os caracteres de uma palavra / frase em uma lista, faça o seguinte:

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


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

Eu acho que você está confuso por causa de um erro de digitação.

Substitua print(words)por print(word)dentro do seu loop para que cada palavra seja impressa em uma linha diferente

Aditya Mukherji
fonte