python - ملخص - موسوعة حسوب بايثون




كيفية تقسيم سلسلة إلى قائمة؟ (6)

أريد وظيفة بيثون لتقسيم جملة (إدخال) وتخزين كل كلمة في قائمة. الشفرة التي قمت بكتابتها حتى الآن تقسم الجملة ، لكنها لا تخزن الكلمات كقائمة. كيف يمكنني فعل ذلك؟

def split_line(text):

    # split the text
    words = text.split()

    # for each word in the line:
    for word in words:

        # print the word
        print(word)

أريد وظيفة بيثون لتقسيم جملة (إدخال) وتخزين كل كلمة في قائمة

أسلوب str().split() يقوم بذلك ، ويأخذ سلسلة ، وينقسم إلى قائمة:

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

المشكلة التي تواجهها هي بسبب خطأ مطبعي ، لقد كتبت print(words) بدلاً من print(word) :

إعادة تسمية متغير word إلى current_word ، هذا ما كان لديك:

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

.. عندما يكون عليك فعل ما يلي:

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

إذا كنت ترغب في إنشاء قائمة يدويًا في حلقة for لسبب ما ، append() طريقة append() القائمة ، ربما لأنك ترغب في تقليل كل الكلمات (على سبيل المثال):

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

أو أكثر إتقانا قليلا ، وذلك باستخدام list-comprehension :

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

أعتقد أنك مرتبك بسبب خطأ مطبعي.

استبدل print(words) print(word) داخل الحلقة حتى تتم طباعة كل كلمة على سطر مختلف


ماذا عن هذه الخوارزمية؟ تقسيم النص على مسافة بيضاء ، ثم تقليم علامات الترقيم. هذا يزيل بعناية علامات الترقيم من حافة الكلمات ، دون الإضرار apostrophes داخل الكلمات مثل 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']

يحتوي .split() وظيفة .split() . وهو يختلف عن str.split() في أنه لا يحافظ على علامات الاقتباس ويتعامل مع عبارة مقتبسة ككلمة واحدة:

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

str.split()

قم بإرجاع قائمة الكلمات في السلسلة ، باستخدام sep كمحدد ... إذا لم يتم تحديد sep أو لا شيء ، يتم تطبيق خوارزمية تقسيم مختلفة: يتم اعتبار المسافات البيضاء المتتالية بمثابة فاصل واحد ، وستحتوي النتيجة على لا توجد سلاسل فارغة في البداية أو النهاية إذا كانت السلسلة تحتوي على مسافة بيضاء سابقة أو لاحقة.

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

text.split()

يجب أن يكون هذا كافيًا لتخزين كل كلمة في قائمة. words هي بالفعل قائمة الكلمات من الجملة ، لذلك ليس هناك حاجة للحلقة.

ثانيًا ، قد يكون خطأً مطبعيًا ، لكنك تعانق حلقة صغيرة. إذا كنت تريد حقًا استخدام التذييل ، فسيكون:

words.append(word)

ليس

word.append(words)




text-segmentation