وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

شمارش تعداد کلمات در لیست پایتون

0 236
زمان لازم برای مطالعه: 4 دقیقه


معرفی

شمارش فرکانس کلمه در یک عنصر لیست در پایتون یک کار نسبتاً رایج است – به ویژه هنگام ایجاد داده های توزیع برای هیستوگرام ها.

بگو ما لیست داریم ('b', 'b', 'a') – دو رخداد «ب» و یکی «الف» داریم. این راهنما به شما سه روش مختلف برای شمارش تعداد کلمات در لیست پایتون نشان می دهد:

  • استفاده از Pandas و NumPy
  • با استفاده از count() تابع
  • با استفاده از مجموعه ماژول Counter
  • با استفاده از یک حلقه و یک متغیر شمارنده

در عمل، شما از Pandas/NumPy استفاده خواهید کرد count() تابع یا الف Counter زیرا استفاده از آنها بسیار راحت است.

استفاده از Pandas و NumPy

کوتاه ترین و ساده ترین راه برای به دست آوردن ارزش در قالبی که به راحتی قابل دستکاری است (DataFrame) از طریق NumPy و Pandas است. ما می توانیم لیست را در یک آرایه NumPy بپیچانیم و سپس آن را فراخوانی کنیم value_counts() روش از pd به عنوان مثال (که برای همه نیز در دسترس است DataFrame موارد):

import numpy as np
import pandas as pd

words = ('hello', 'goodbye', 'howdy', 'hello', 'hello', 'hi', 'bye')

pd.value_counts(np.array(words))

این منجر به یک DataFrame که حاوی:

hello      3
goodbye    1
bye        1
howdy      1
hi         1
dtype: int64

می توانید به آن دسترسی داشته باشید values میدان برای گرفتن شمارش خود، یا index برای دریافت خود کلمات:

df = pd.value_counts(np.array(words))

print('Index:', df.index)
print('Values:', df.values)

این منجر به:

Index: Index(('hello', 'goodbye', 'bye', 'howdy', 'hi'), dtype='object')

Values: (3 1 1 1 1)

با استفاده از شمردن() تابع

راه “استاندارد” (بدون کتابخانه خارجی) برای به دست آوردن تعداد تکرار کلمات در یک لیست، استفاده از شی لیست است. count() تابع.

این count() متد یک تابع داخلی است که یک عنصر را به عنوان تنها آرگومان خود می گیرد و تعداد دفعاتی که آن عنصر در لیست ظاهر می شود را برمی گرداند.

پیچیدگی از count() تابع است بر)، جایی که n تعداد عوامل موجود در لیست است.

کد زیر استفاده می کند count() برای به دست آوردن تعداد تکرار یک کلمه در یک لیست:

words = ('hello', 'goodbye', 'howdy', 'hello', 'hello', 'hi', 'bye')

print(f'"hello" appears {words.count("hello")} time(s)')
print(f'"howdy" appears {words.count("howdy")} time(s)')

این باید همان خروجی قبل از استفاده از حلقه ها را به ما بدهد:

"hello" appears 3 time(s)
"howdy" appears 1 time(s)

این count() متد یک راه آسان برای به دست آوردن تعداد تکرار کلمات در یک لیست برای هر کلمه به ما ارائه می دهد.

با استفاده از مجموعه ماژول پیشخوان

این Counter نمونه کلاس می تواند برای شمارش نمونه های دیگر اشیاء استفاده شود. با ارسال یک لیست به سازنده آن، a را نمونه می کنیم Counter که یک دیکشنری از تمام عناصر و رخدادهای آنها در یک لیست را برمی گرداند.

از آنجا، برای به دست آوردن وقوع یک کلمه، فقط می توانید از کلمه به عنوان کلید فرهنگ لغت استفاده کنید:

from collections import Counter

words = ('hello', 'goodbye', 'howdy', 'hello', 'hello', 'hi', 'bye')

word_counts = Counter(words)

print(f'"hello" appears {word_counts("hello")} time(s)')
print(f'"howdy" appears {word_counts("howdy")} time(s)')

این منجر به:

"hello" appears 3 time(s)
"howdy" appears 1 time(s)

با استفاده از یک حلقه و یک متغیر شمارنده

در نهایت، یک رویکرد brute force که از طریق هر کلمه در لیست حلقه می زند، یک شمارنده را با یک کلمه افزایش می دهد و تعداد کل کلمات را برمی گرداند!

البته، این روش با افزایش اندازه لیست ناکارآمدتر می شود، فقط درک و پیاده سازی آن از نظر مفهومی آسان است.

کد زیر از این رویکرد در count_occurrence() روش:

def count_occurrence(words, word_to_count):
    count = 0
    for word in words:
        if word == word_to_count:
          
            count = count + 1
    return count


words = ('hello', 'goodbye', 'howdy', 'hello', 'hello', 'hi', 'bye')
print(f'"hello" appears {count_occurrence(words, "hello")} time(s)')
print(f'"howdy" appears {count_occurrence(words, "howdy")} time(s)')

اگر این کد را اجرا کنید باید این خروجی را ببینید:

"hello" appears 3 time(s)
"howdy" appears 1 time(s)

خوب و ساده!

کارآمدترین راه حل؟

به طور طبیعی – اگر با مجموعه وسیعی از کلمات سروکار دارید، به دنبال کارآمدترین راه حل خواهید بود. بیایید همه اینها را محک بزنیم تا ببینیم عملکرد آنها چگونه است.

کار را می توان به یافتن رخدادها برای همه کلمات یا الف تنها word، و ما معیارهایی را برای هر دو انجام خواهیم داد، که با همه کلمات شروع می شود:

import numpy as np
import pandas as pd
import collections

def pdNumpy(words):
    def _pdNumpy():
        return pd.value_counts(np.array(words))
    return _pdNumpy

def countFunction(words):
    def _countFunction():
        counts = ()
        for word in words:
            counts.append(words.count(word))
        return counts
    return _countFunction

def counterObject(words):
    def _counterObject():
        return collections.Counter(words)
    return _counterObject
    
import timeit

words = ('hello', 'goodbye', 'howdy', 'hello', 'hello', 'hi', 'bye')

print("Time to execute:\n")
print("Pandas/NumPy: %ss" % timeit.Timer(pdNumpy(words)).timeit(1000))
print("count(): %ss" % timeit.Timer(countFunction(words)).timeit(1000))
print("Counter: %ss" % timeit.Timer(counterObject(words)).timeit(1000))

که منجر به:

Time to execute:

Pandas/NumPy: 0.33886080000047514s
count(): 0.0009540999999444466s
Counter: 0.0019409999995332328s

این count() این روش در مقایسه با انواع دیگر بسیار سریع است، با این حال، برچسب های مرتبط با شمارش را مانند دو مورد دیگر به ما نمی دهد.

اگر به برچسب ها نیاز دارید – Counter از ناکارآمد بهتر عمل می کند process قرار دادن لیست در یک آرایه NumPy و سپس شمارش.

از سوی دیگر، می‌توانید از روش‌های DataFrame برای مرتب‌سازی یا دستکاری‌های دیگری استفاده کنید که در غیر این صورت نمی‌توانید انجام دهید. Counter چند روش منحصر به فرد نیز دارد.

در نهایت، شما می توانید استفاده کنید Counter برای ایجاد دیکشنری و تبدیل دیکشنری به a DataFrame و همچنین، برای افزایش سرعت Counter و تطبیق پذیری DataFrames:

df = pd.DataFrame.from_dict((Counter(words))).T

اگر به برچسب ها نیاز ندارید – count() راهی برای رفتن است

از طرف دیگر، اگر به دنبال یک کلمه واحد هستید:

import numpy as np
import pandas as pd
import collections

def countFunction(words, word_to_search):
    def _countFunction():
        return words.count(word_to_search)
    return _countFunction

def counterObject(words, word_to_search):
    def _counterObject():
        return collections.Counter(words)(word_to_search)
    return _counterObject

def bruteForce(words, word_to_search):
    def _bruteForce():
        counts = ()
        count = 0
        for word in words:
            if word == word_to_search:
              
                count = count + 1
            counts.append(count)
        return counts
    return _bruteForce
    
import timeit

words = ('hello', 'goodbye', 'howdy', 'hello', 'hello', 'hi', 'bye')

print("Time to execute:\n")
print("count(): %ss" % timeit.Timer(countFunction(words, 'hello')).timeit(1000))
print("Counter: %ss" % timeit.Timer(counterObject(words, 'hello')).timeit(1000))
print("Brute Force: %ss" % timeit.Timer(bruteForce(words, 'hello')).timeit(1000))

که منجر به:

Time to execute:

count(): 0.0001573999998072395s
Counter: 0.0019498999999996158s
Brute Force: 0.0005682000000888365s

جستجوی نیروی بی رحم و count() روش ها بهتر از Counter، عمدتا به دلیل Counter ذاتاً به حساب می آید تمام کلمات به جای یکی

نتیجه

در این راهنما، یافتن وقوع کلمه در لیست پایتون، ارزیابی کارایی هر راه حل و وزن کردن زمانی که هر کدام مناسب تر است را بررسی کردیم.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-07 10:07:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید