Come dividere una stringa in un elenco?


574

Voglio che la mia funzione Python divida una frase (input) e memorizzi ogni parola in un elenco. Il mio codice attuale divide la frase, ma non memorizza le parole come un elenco. Come lo faccio?

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
Quale parte di questo codice non funziona? Potete fornire il messaggio di errore o il problema riscontrato?
S.Lott

4
Così com'è, verrà stampato l'elenco completo delle parole per ogni parola nell'elenco. Penso che intendevi usare print(word)come ultima riga.
tgray,

Risposte:


487
text.split()

Questo dovrebbe essere sufficiente per memorizzare ogni parola in un elenco. wordsè già un elenco delle parole della frase, quindi non è necessario il ciclo.

In secondo luogo, potrebbe essere un errore di battitura, ma hai il tuo loop un po 'incasinato. Se davvero volessi usare append, sarebbe:

words.append(word)

non

word.append(words)

447

Divide la stringa in texttutte le esecuzioni consecutive di spazi bianchi.

words = text.split()      

Dividere la stringa in textsu delimitatore: ",".

words = text.split(",")   

La variabile parole sarà a liste conterrà le parole textdivise sul delimitatore.


86

str.split ()

Restituisce un elenco di parole nella stringa, usando sep come delimitatore ... Se sep non è specificato o è None, viene applicato un diverso algoritmo di suddivisione: le esecuzioni di spazi bianchi consecutivi sono considerate come un singolo separatore e il risultato conterrà nessuna stringa vuota all'inizio o alla fine se la stringa ha spazi bianchi iniziali o finali.

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

@warvariuc - avrebbe dovuto essere collegato a docs.python.org/2/library/stdtypes.html#str.split
gimel il

52

A seconda di cosa hai intenzione di fare con la tua frase come una lista, potresti voler guardare il kit linguistico Natural Language . Si occupa fortemente dell'elaborazione e della valutazione del testo. Puoi anche usarlo per risolvere il tuo problema:

import nltk
words = nltk.word_tokenize(raw_sentence)

Ciò ha l'ulteriore vantaggio di dividere la punteggiatura.

Esempio:

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

Ciò ti consente di filtrare qualsiasi punteggiatura che non desideri e di utilizzare solo parole.

Si noti che le altre soluzioni utilizzano string.split() sono migliori se non si prevede di manipolare in modo complesso la frase.

[Modificato]


5
split()si basa sullo spazio bianco come separatore, quindi non riuscirà a separare le parole sillabate - e anche le frasi separate a trattino lungo non potranno dividersi. E se la frase contiene segni di punteggiatura senza spazi, questi non si attaccheranno. Per qualsiasi analisi del testo nel mondo reale (come per questo commento), il tuo suggerimento nltk è molto meglio di split () `.
Piani cottura

2
Potenzialmente utile, anche se non lo definirei come una divisione in "parole". Con una semplice definizione inglese, ','e "'s"non sono parole. Normalmente, se si desidera dividere la frase sopra in "parole" in modo sensibile alla punteggiatura, si desidera eliminare la virgola e ottenere "fox's"come una sola parola.
Mark Amery,

1
Python 2.7+ a partire da aprile 2016.
AnneTheAgile

31

Che ne dici di questo algoritmo? Dividi il testo negli spazi bianchi, quindi ritaglia la punteggiatura. Questo rimuove accuratamente la punteggiatura dal bordo delle parole, senza danneggiare gli apostrofi all'interno di parole come 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
Bello, ma alcune parole inglesi contengono davvero punteggiatura finale. Ad esempio, i punti finali in e.g.e Mrs., e l'apostrofo finale nel possessivo frogs'(come in frogs' legs) fanno parte della parola, ma saranno eliminati da questo algoritmo. La gestione corretta delle abbreviazioni può essere approssimativamente ottenuta rilevando inizialismi separati da punti e utilizzando un dizionario di casi speciali (come Mr., Mrs.). Distinguere gli apostrofi possessivi dalle virgolette singole è drammaticamente più difficile, poiché richiede l'analisi della grammatica della frase in cui è contenuta la parola.
Mark Amery,

2
@MarkAmery Hai ragione. Mi è anche venuto in mente che alcuni segni di punteggiatura, come il trattino, possono separare le parole senza spazi.
Colonnello Panic,

16

Voglio che la mia funzione Python divida una frase (input) e memorizzi ogni parola in un elenco

Il str().split()metodo fa questo, prende una stringa, la divide in un elenco:

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

Il problema che stai riscontrando è a causa di un errore di battitura, hai scritto print(words)invece di print(word):

Rinominando la wordvariabile in current_word, questo è quello che avevi:

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

..quando avresti dovuto fare:

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

Se per qualche motivo vuoi costruire manualmente un elenco nel ciclo for, dovresti usare il append()metodo list , forse perché vuoi mettere in minuscolo tutte le parole (per esempio):

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

O più un po 'più ordinato, usando una comprensione della lista :

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

12

shlex ha una .split()funzione. Si differenzia dal fatto str.split()che non conserva le virgolette e tratta una frase citata come una singola parola:

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

10

Se vuoi tutti i caratteri di una parola / frase in un elenco, procedi come segue:

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


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

4

Penso che tu sia confuso a causa di un errore di battitura.

Sostituisci print(words)con print(word)all'interno del tuo loop per stampare ogni parola su una riga diversa

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.