Hoe een tekenreeks in een lijst te splitsen?

Ik wil dat mijn Python-functie een zin (invoer) splitsen en elk woord opslaan in een lijst. Mijn huidige code splitst de zin, maar slaat de woorden niet op als een lijst. Hoe doe ik dat?

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)

Antwoord 1, Autoriteit 100%

text.split()

Dit zou voldoende moeten zijn om elk woord in een lijst op te slaan. wordsis al een lijst met de woorden uit de zin, dus er is geen behoefte aan de lus.

Ten tweede, het is misschien een typfout, maar je hebt je lus een beetje in de war. Als je echt een append wilde gebruiken, zou het zijn:

words.append(word)

niet

word.append(words)

Antwoord 2, Autoriteit 90%

splitst de tekenreeks in textop eventuele opeenvolgende runs van witruimte.

words = text.split()      

Splits de tekenreeks in textop scheidingsteken: ",".

words = text.split(",")   

De woorden variabele zijn een listen bevatten de woorden van textSplitsen op de scheidingsteken.


Antwoord 3, Autoriteit 18%

str.split ()

Retourneer een lijst van de woordenin de tekenreeks, met sep als scheidingsteken
… Als sep niet is opgegeven of Geen is, wordt een ander splitsingsalgoritme toegepast: reeksen opeenvolgende witruimten worden beschouwd als een enkel scheidingsteken en het resultaat bevat geen lege tekenreeksen aan het begin of einde als de tekenreeks een voorloop- of een volgtekenreeks heeft witte ruimte.

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

Antwoord 4, autoriteit 11%

Afhankelijk van wat je van plan bent te doen met je zin-als-een-lijst, kun je de Natuurlijke Taalpakket. Het houdt zich intensief bezig met tekstverwerking en evaluatie. Je kunt het ook gebruiken om je probleem op te lossen:

import nltk
words = nltk.word_tokenize(raw_sentence)

Dit heeft als bijkomend voordeel dat leestekens worden uitgesplitst.

Voorbeeld:

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

Hierdoor kunt u alle interpunctie die u niet wilt gebruiken eruit filteren en alleen woorden gebruiken.

Houd er rekening mee dat de andere oplossingen die string.split()gebruiken, beter zijn als je niet van plan bent om de zin ingewikkeld te manipuleren.

[Bewerkt]


Antwoord 5, autoriteit 7%

Hoe zit het met dit algoritme? Splits tekst op witruimte en snij de interpunctie bij. Dit verwijdert zorgvuldig leestekens aan de rand van woorden, zonder apostrofs in woorden zoals we'rete beschadigen.

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

Antwoord 6, autoriteit 3%

Ik wil dat mijn python-functie een zin splitst (invoer) en elk woord in een lijst opslaat

De str().split()methode doet dit, er is een string voor nodig en splitst deze in een lijst:

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

Het probleem dat u ondervindt, is vanwege een typefout, u schreef print(words)in plaats van print(word):

De variabele wordhernoemen naar current_word, dit is wat je had:

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

..wanneer je had moeten doen:

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

Als u om een ​​of andere reden een lijst in de voor lus wilt construeren, gebruikt u de lijst append()METHODE, MISHAPS OMDAT U WILT DAT JE ALLE WOORDEN WORDT GEBRUIKT (bijvoorbeeld) :

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

of meer een beetje nette, met behulp van een lijst-begrip :

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

Antwoord 7, Autoriteit 3%

Als u alle tekens van een woord / zin in een lijst wilt, doe dit dan:

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

Antwoord 8, Autoriteit 3%

shlex heeft een .split()functie. Het verschilt van str.split()Doordat het geen citaten behoudt en een geciteerde zin als één woord behandelt:

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

NB: het werkt goed voor Unix-achtige commandoregelreeksen. Het werkt niet voor verwerking in natuurlijke taal.


Antwoord 9

Ik denk dat je in de war bent vanwege een typefout.

Vervang print(words)door print(word)in je lus om elk woord op een andere regel te laten afdrukken


Antwoord 10

Splits de woorden zonder apostrofs in woorden te beschadigen
Zoek de input_1 en input_2 Wet van Moore

def split_into_words(line):
    import re
    word_regex_improved = r"(\w[\w']*\w|\w)"
    word_matcher = re.compile(word_regex_improved)
    return word_matcher.findall(line)
#Example 1
input_1 = "computational power (see Moore's law) and "
split_into_words(input_1)
# output 
['computational', 'power', 'see', "Moore's", 'law', 'and']
#Example 2
input_2 = """Oh, you can't help that,' said the Cat: 'we're all mad here. I'm mad. You're mad."""
split_into_words(input_2)
#output
['Oh',
 'you',
 "can't",
 'help',
 'that',
 'said',
 'the',
 'Cat',
 "we're",
 'all',
 'mad',
 'here',
 "I'm",
 'mad',
 "You're",
 'mad']

Other episodes