Bir dizeyi listeye nasıl bölebilirim?


574

Python fonksiyonumun bir cümle (giriş) bölmesini ve her kelimeyi bir listede saklamasını istiyorum. Geçerli kodum cümleyi böler, ancak kelimeleri liste olarak saklamaz. Bunu nasıl yaparım?

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
Bu kodun hangi kısmı çalışmıyor? Hata mesajını veya yaşadığınız sorunu bildirebilir misiniz?
S.Lott

4
Olduğu gibi, listedeki her kelime için tam kelime listesini yazdıracaksınız. Bence print(word)son hattın olarak kullanmak istedin.
tgray

Yanıtlar:


487
text.split()

Bu, her sözcüğü bir listede saklamak için yeterli olmalıdır. wordszaten cümlenin kelimelerinin bir listesidir, bu yüzden döngüye gerek yoktur.

İkincisi, bu bir yazım hatası olabilir, ancak döngünüz biraz dağınık. Eğer gerçekten append kullanmak istiyorsanız, şöyle olur:

words.append(word)

değil

word.append(words)

447

Dizeyi, textardışık boşluk çalışmalarında böler .

words = text.split()      

Dizeyi Bölünmüş textsınırlayıcıya: ",".

words = text.split(",")   

Words değişkeni a olacak ve ayırıcıdaki split listkelimelerini içerecektir text.


86

str.split ()

Sınırlayıcı olarak sep kullanarak dizedeki sözcüklerin bir listesini döndürün ... sep belirtilmezse veya None ise, farklı bir bölme algoritması uygulanır: ardışık boşluk alanlarının çalışması tek bir ayırıcı olarak kabul edilir ve sonuç dizenin başında veya sonunda boşluk varsa, başlangıç ​​veya bitişte boş dize yoktur.

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


52

Listedeki cümle ile ne yapmayı planladığınıza bağlı olarak, Doğal Dil Aldı Seti'ne bakmak isteyebilirsiniz . Metin işleme ve değerlendirme ile yoğun şekilde ilgilenir. Sorununuzu çözmek için de kullanabilirsiniz:

import nltk
words = nltk.word_tokenize(raw_sentence)

Bu, noktalama işaretlerini bölme avantajına sahiptir.

Misal:

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

Bu, istemediğiniz noktalama işaretlerini filtrelemenize ve yalnızca kelimeleri kullanmanıza olanak tanır.

string.split()Cümlenin karmaşık bir şekilde değiştirilmesini planlamıyorsanız , diğer çözümlerin daha iyi olduğunu lütfen unutmayın .

[Düzenleyen]


5
split()ayırıcı olarak beyaz boşluğa dayanır, bu nedenle tireli kelimeleri ayırmakta başarısız olur - ve uzun kesikli ayrılmış ifadeler de bölünemez. Ve cümle boşluksuz herhangi bir noktalama işareti içeriyorsa, bunlar yapışmaz. Herhangi bir gerçek dünya metin ayrıştırma için (bu yorumda olduğu gibi), nltk öneriniz split () `den çok daha iyidir.
Ocaklar

2
Potansiyel olarak yararlı olsa da, bunu "kelimelere" bölmek olarak tanımlamam. Herhangi bir düz İngilizce tanımı ile, ','ve "'s"kelime değildir. Normalde, yukarıdaki cümleyi noktalama işaretli bir şekilde "kelimelere" bölmek isterseniz, virgülün işaretini kaldırmak ve "fox's"tek bir kelime olarak almak istersiniz .
Mark Amery

1
Nisan 2016 itibariyle Python
2.7+

31

Bu algoritmaya ne dersiniz? Boşlukta metin bölün, sonra noktalama işaretlerini kesin. Bu, noktalama işaretlerini kelimelerin içindeki kesme işaretlerine zarar vermeden kelimelerin kenarından dikkatlice kaldırır 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
Güzel, ama bazı İngilizce kelimeler gerçekten sondaki noktalama işaretleri içeriyor. Örneğin, ve içindeki sondaki noktalar e.g.ve Mrs.iyelikteki frogs'(olduğu gibi frogs' legs) sondaki kesme işareti kelimenin bir parçasıdır, ancak bu algoritma ile soyulur. Kısaltmaların doğru bir şekilde kullanılması, noktadan ayrılmış başlangıcın algılanması ve özel durumlar sözlüğü (örneğin , ) kullanılarak kabaca elde edilebilir . İyelik apostroflarını tek tırnaklardan ayırmak, kelimenin içerdiği cümlenin dilbilgisini ayrıştırmayı gerektirdiğinden, dramatik olarak daha zordur. Mr.Mrs.
Mark Amery

2
@MarkAmery Haklısın. O zamandan beri, bana verilen noktalama işaretleri gibi bazı noktalama işaretleri boşlukları olmayan sözcükleri ayırabilir.
Albay Panik

16

Python fonksiyonumun bir cümle (giriş) bölmesini ve her kelimeyi bir listede saklamasını istiyorum

str().split()Yöntem bir liste böler, bir dize alır yapar:

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

Bir yazım hatası, sen yazdığı için yaşadığınız sorunun print(words)yerine print(word):

wordDeğişkeni yeniden adlandırdığınızda, sahip current_wordolduğunuz şey budur:

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

.. Yapmanız gereken zaman:

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

Herhangi bir nedenle for döngüsünde el ile bir liste oluşturmak istiyorsanız append(), belki de tüm kelimeleri küçük harfle yazmak istediğiniz için (örneğin) list yöntemini kullanırsınız :

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

Ya da bir liste kavrayışı kullanarak biraz daha temiz :

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

12

shlex'in bir .split()işlevi vardır. str.split()Tırnak işaretlerini korumaması ve alıntı yapılan bir cümleyi tek bir kelime olarak ele alması bakımından farklılık gösterir :

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

10

Listede bir kelimenin / cümlenin tüm karakterlerini istiyorsanız , bunu yapın:

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


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

4

Bence bir yazım hatası yüzünden kafan karıştı.

Değiştir print(words)ile print(word)döngü içinde her kelime farklı bir çizgi üzerinde yazılı olması

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.