در طول مدتی که با مجموعه داده‌ها در پایتون کار می‌کردم، دیکشنری بیشترین استفاده را از ساختار داده برای من داشته است. این همه کاره و آسان برای استفاده است.

آیا نیاز به شمارش اتفاقات یک شخصیت دارید؟ از یک دیکشنری استفاده کن!

آیا می خواهید لیستی از بازیکنان فوتبال و آمار مربوط به آن ایجاد کنید؟ فرهنگ لغت!

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

برخورد با این خطاها منجر به ایجاد چندین خط کد اضافی می شود. این باعث کاهش خوانایی و افزایش پیچیدگی می شود. اگر داده های زیادی را مدیریت می کنید، این مشکل می تواند از کنترل خارج شود.

ماژول مجموعه ها به این مشکل پیچیدگی می پردازد. ماژول مجموعه ها بخشی از کتابخانه استاندارد پایتون است که شامل چند روش عالی برای بحث کردن داده ها است. هدف اصلی ماژول این است که کد شما را خواناتر کند و پردازش داده ها را با انواع اضافی ساده کند.

چیزی که من بیشتر از همه استفاده می کنم این است defaultdict، و ما امروز چند مورد استفاده ساده برای آن را بررسی خواهیم کرد. برای درک کامل این داده ها container، باید دانش کاری پایتون داشته باشید. به طور خاص، نوع دیکشنری معمولی.

چگونه کد خود را با DefaultDict ساده کنید

قبل از پرداختن به موضوع امروز، بیایید به یک موقعیت نگاه کنیم. من می خواهم یک فرهنگ لغت ایجاد کنم که تعداد حروف مختلف کلمه “می سی سی پی” را به من بدهد. S و P زیاد است و من وقت ندارم همه آنها را با دست بشمارم.

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

letters = {}

for letter in "Mississippi":
    if letter not in letters:
    	letters[letter] = 1
    else:
    	letters[letter] +=1
    
print(letters)
# {'M': 1, 'i': 4, 's': 4, 'p': 2}
دریافت حرف در کلمه “می سی سی پی” با یک فرهنگ لغت معمولی حساب می شود

به اندازه کافی ساده این برنامه:

  • از طریق رشته تکرار می شود.
  • هر بار تکرار، بررسی می‌کرد که آیا نامه در حال حاضر ورودی به فرهنگ لغت حروف ما دارد یا خیر.
  • اگر حرف موجود باشد، یک عدد به مقدار فعلی اضافه می کند.
  • اگر حرف در فرهنگ لغت حروف وجود نداشته باشد، ورودی را ایجاد کرده و مقدار اولیه را 1 قرار می دهد.
پیشنهاد می‌کنیم بخوانید:  Python: Slice Notation روی چندتایی

این مثال بسیار آسان بود، اما می‌توانید پیچیدگی کد را در حال حاضر مشاهده کنید. بیایید ببینیم چگونه می توانیم بهتر عمل کنیم:

from collections import defaultdict

letters = defaultdict(int)

for letter in "Mississippi":
    letters[letter] += 1
    
print(letters)
# defaultdict(<class 'int'>, {'M': 1, 'i': 4, 's': 4, 'p': 2})
دریافت حرف در کلمه “می سی سی پی” با پیش فرض حساب می شود

باید توجه داشته باشید که تمام عبارات شرطی اکنون از بین رفته اند. خواندن کد باید کمی ساده تر باشد، اما ما همچنان در پایان برنامه به همان نتیجه رسیدیم.

این مزیت است defaultdict. بیایید این داده ها را بشکنیم container پایین.

کاوش در داده های DefaultDict Container

ایده الف defaultdict ساده است: اگر بخواهیم به کلیدی که وجود ندارد دسترسی پیدا کنیم یا مقدار آن را تغییر دهیم، ورودی را در فرهنگ لغت با مقدار پیش فرض داده شده ایجاد می کند.

در مثال بالا، ما با یک پیش فرض خالی و بدون ورودی شروع کردیم. برای هر حرف منحصر به فردی که تجزیه کردیم، فرهنگ لغت یک مدخل ایجاد کرد. از آنجایی که استفاده کردیم int به عنوان مقدار پیش فرض، مقدار مدخل ایجاد شده 0 بود. پس از اینکه فرهنگ لغت مدخل را ایجاد کرد، یک ورودی به مدخل اضافه کرد.

در پایان برنامه، شمارش حروف بدون شرط یا مداخله دستی خروجی شد. خیلی پایتونیک

روش تنظیم پیش فرض در DefaultDict

را defaultdict داده ها container یک آرگومان منفرد را در طول مقداردهی اولیه خود می گیرد که به نام آن نامگذاری شده است default_factory.

این default_factory آرگومان یک تابع است. هنگامی که برنامه سعی می کند به ورودی که وجود ندارد دسترسی پیدا کند، defaultdict تماس می گیرد default_factory بدون هیچ استدلالی بنابراین، به عنوان مثال، من می توانم تماس بگیرید defaultdict با عملکرد int() مثل این:

d1 = defaultdict(int)

وقتی سعی می کنم به ورودی که وجود ندارد دسترسی پیدا کنم، آن ورودی را با مقدار the اضافه می کنم int تابع، که 0 است.

d1 = defaultdict(int)

d1[“Adding an entry!”]

Print(d1)
# defaultdict(<class 'int'>, {'Adding an Entry!': 0})
نمایش ایجاد ورودی‌های ناموجود

بررسی امکانات DefaultDict

اکنون که کاربرد اساسی آن را می دانید defaultdict، می توانیم احتمالات را بررسی کنیم.

پیشنهاد می‌کنیم بخوانید:  روش فیلتر کردن یک شی با کلید در جاوا اسکریپت اشیاء جاوا اسکریپت مانند آرایه ها یا رشته ها قابل تکرار نیستند، بنابراین نمی توانیم مستقیماً از متد filter() استفاده کنیم. روی یک شی filter() به ما امکان می دهد از طریق یک آرایه تکرار کنیم و فقط آیتم های آن آرایه که با معیارهای خاصی مطابقت دارند را به یک آرایه جدید برمی گرداند. اگر می خواهید به ...

همانطور که قبلا ذکر کردم، default_factory یک تابع بدون آرگومان است. این بدان معناست که ما می‌توانیم از انواع داده‌های داخلی و همچنین توابع تعریف‌شده سفارشی استفاده کنیم – تا زمانی که آرگومان‌ها را دریافت نکنند.

بیایید به مثال می سی سی پی خود برگردیم. من می خواهم بدانم شاخص واقعی تمام حرف من کجاست. من قصد دارم از a استفاده کنم defaultdict با لیستی برای default_factory آرگومان تا بتوانیم همه شاخص ها را ردیابی کنیم.

from collections import defaultdict

my_word = "Mississippi"

d1 = defaultdict(list)

for index, letter in enumerate(my_word):
	if letter == "i":
		d1[letter].append(index)
        
print(d1)
# defaultdict(<class 'list'>, {'i': [1, 4, 7, 10]})

عالی! من این مثال را به صورت دستی بررسی کردم و به نظر می رسد درست است. حرف من در فهرست 1، 4، 7 و 10 وجود دارد.

این مثال کمی متفاوت به نظر می رسد، اما ایده همچنان یکسان است. در اینجا مراحل انجام می شود:

  • من ایجاد کردم defaultdict با default_factory استدلال از list.
  • من از طریق کلمه “می سی سی پی” تکرار کردم.
  • اگر حرف تکرار شده برابر با “i” باشد، با کلید “i” به فرهنگ لغت دسترسی پیدا می کنم.
  • اگر آن مدخل در فرهنگ لغت از قبل وجود نداشته باشد، defaultdict داده ها container آن را برای من ایجاد می کند و از یک لیست خالی به عنوان مقدار استفاده می کند.
  • سپس از روش ضمیمه لیست برای اضافه کردن نمایه حرف تکرار شده استفاده می کنم.

بیایید بیشتر کاوش کنیم. از آنجا که default_factory یک تابع را به عنوان یک آرگومان می گیرد، ما می توانیم تابع خود را تعریف کنیم – تا زمانی که تابع سفارشی ما آرگومان نگیرد.

from collections import defaultdict

def return_hello():
	return "Hello!"
    
d1 = defaultdict(return_hello)

d1[1]
d1[2]
d1[3]

print(d1)
# defaultdict(<function return_hello at 0x0000014FC5D28DC0>, {1: 'Hello!', 2: 'Hello!', 3: 'Hello!'})
نمایش ایجاد ورودی‌های موجود در یک پیش‌فرض

من یک تابع را در اینجا تعریف کردم تا به سادگی “Hello!” را برگرداند. و آن را به default_factory بحث و جدل. اکنون، وقتی سعی می کنیم به مدخل هایی در فرهنگ لغت خود دسترسی پیدا کنیم که وجود ندارند، defaultdict تابع سفارشی من را برای تعیین مقدار پیش فرض فراخوانی می کند!

برای جمع بندی

در این راهنما، به این موارد پرداختیم defaultdict، که یک داده است container در ماژول مجموعه های داخلی از کتابخانه استاندارد پایتون. این به ما امکان می دهد با ایجاد آنها به مدخل هایی در فرهنگ لغت دسترسی پیدا کنیم که وجود ندارند روی fly و اختصاص یک مقدار پیش فرض.

دیدیم که defaultdict الف می گیرد default_factory آرگومان، که به فرهنگ لغت می‌گوید مقدار پیش‌فرض یک کلید را بدهد. اینها می توانند توابع داخلی باشند، مانند int یا list، یا می توانند توابع سفارشی تعریف شده باشند، مانند ما return_hello عملکرد بالا

امیدوارم امروز چیزی یاد گرفته باشید!