از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
شمارش تعداد کلمات در لیست پایتون
سرفصلهای مطلب
معرفی
شمارش فرکانس کلمه در یک عنصر لیست در پایتون یک کار نسبتاً رایج است – به ویژه هنگام ایجاد داده های توزیع برای هیستوگرام ها.
بگو ما لیست داریم ('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
و تطبیق پذیری DataFrame
s:
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