ریاضیات در پایتون – نظریه مجوعه ها

در مفاهیم ریاضی، مجموعه (set) دسته ای از اشیا دو به دو متمایز است که این اشیا، عضوها یا عناصر مجموعه نامیده می‌شوند. در مجموعه هیچ عضو یا عنصر تکراری وجود ندارد و به عبارت دیگر اعضای مجموعه ها همگی منحصر به فرد (unique) هستند. در پایتون set (مجموعه) همانند لیست، تاپل، دیکشنری یک ساختار داده (data structure) است که بسیار شبیه به لیست ها است با این تفاوت که در لیست ها عضو (یا عنصر) تکراری وجود دارد ولی در مجموعه تمامی عناصر منحصر به فرد هستند.

کاربرد مجموعه

از کاربرد مجموعه (در پایتون) می توان به پیدا کردن عنصرهای تکراری (duplicate) اشاره کرد. به مثال لیستی از عناصر داریم و می خواهیم تمامی عناصر تکراری آن را حذف کنیم. یا به طور مثال یک لیست از رشته ها داریم و می خواهیم رشته هایی را پیدا کنیم که در آنها حرف تکراری وجود دارد. به طور مثال unique و foo و None رشته هایی هستند که در آنها حرف تکراری وجود دارد ولی رشته های False و True رشته هایی هستند که در آنها حرف تکراری وجود ندارد.

اما استفاده از نظریه مجموعه ها (set theory) کاربرد فراوانی دارد. یکی از مهمرین مفاهیم، پایگاه داده های رابطه ای (relational databas) هستند که توسط کاد (codd) بر اساس نظریه مجموعه ارائه شده است. به طور مثال زبان sql که برای دسترسی به داده های درون rdbms (یا relational database management system) استفاده می شود، مبتنی بر مفاهیم مجموعه ها است. به طور مثال وقتی می خواهیم مقادیر غیر تکراری (DISTINCT) یک ستون را پیدا کنیم و یا می خواهیم عملیات های join را انجام دهیم.

ایجاد نوع ساختار داده set

برای ایجاد یک set می توانیم در ابتدا یک لیست ایجاد کنیم و سپس توسط تابع درونی ()set را برای ایجاد کردن نوع set استفاده کنیم. توجه کنید که در نوع جدید که توسط تابع ()set ایجاد می شود، تمامی عناصر تکراری حذف خواهند شد. کد زیر نمونه مثال ساده ای را نشان می دهد که در ابتدا یک لیست از اعداد ایجاد کرده اغیم و سپس متغیر s1 ر ا به تابع ()set فرستاده و در نهایت نوع برگشتی از تابع که یک مجموعه از عناصر غیر تکراری است را درون خود متغیر s1 ذخیره کرده ایم.

خروجی تابع ()print در کدهای بالا به صورت {9, 5, 4, 3, 2, 1, 0} است بنابراین عناصر تکراری حذف شدند، عناصر (صعودی) مرتب شده اند و همچنین اگر مطابق با مفاهیم ریاضی که عناصر مجموعه میان آکولادهای باز و بسته قرار می گیرند، در اینجا نیز عناصر میان آکولادهای باز و بسته قرار گرفته اند و نباید آنرا با دیشکنری ها اشتباه بگیرد. به عبارت دیگر خروجی خط سوم از کد بالا، class set است که به معنی مجموعه بودن متغیر s1 است قطعه کد زیر نمونه مثال دیگری از ایجاد مجموعه را نشان می دهد که به جای تبدیل لیست به مجموعه توسط تابع ()set، یکباره اعضای مجموعه را میان آکولادهای باز و بسته قرار داده ایم.

تفاوت لیست با مجموعه و ویژگی های مجموعه

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

۲ – نمی توانیم یک عنصر درون مجموعه را تغییر دهیم، پس دستور زیر باعث بروز خطا می شود.

۳ – خود مجموعه را می توانیم تغییر دهیم. به طور مثال در دستورهای زیر ابتدا یک لیست از رشته ها تعریف و در متغیر s4 ذخیره می شود و سپس یک مجموعه جدید از اعداد را به متغیر s4 انستاب می دهیم.

۴ – عناصر لیست تکراری  باشند ولی عناصر مجموعه غیر تکراری هستند.

اضافه کردن و بروز رسانی اعضا

هر شی (نمونه) از set در پایتون دارای دو متد به نام های ()add و ()update است که عضوهای جدیدی را به مجموعه اضافه می کنند. متد ()add یک تک مقدار را دریافت می کند ولی متد ()update یک یا چندین لیست یا مجموعه از اعضای جدید را در یافت می کند. مثال زیر اعضای جدید را به مجموعه s4 اضافه می کند. با توجه به کد قبلی، s4 مجموعه ای از اعداد بود. در خط ۲ یک رشته به مجموعه s4 به نام python اضافه شد. در خط ۳ یک لیست و در خط ۵ یک مجموعه به s4 اضافه شده است. در خط ۷ نیز یک لیست و یک مجموعه به s4 اضافه شده اند. بنابراین می توانیم نتیجه بگیریم که اعضای یک لیست می توانند از انواع مختلفی باشند.

حذف عناصر لیست

هر شی (نمونه) از set در پایتون دارای دو متد به نام های ()discard و ()remove است که عضوی از مجموعه را حذف می کنند. تفاوت متد ()dsicard و ()remove در این است که اگر عنصری که در مجموعه وجود ندارد را به متد ()discard بفرستید هیچ خطایی نشان داده نمی شود ولی اگر عنصری که در مجموعه وجود ندارد را به متد ()remove بفرستید، یک خطا نشان داده خواهد شد.

متد ()clear کل عناصر یک مجموعه را پاک می کند. متد دیگری به نام ()pop وجود دارد که اولا عنصر اول درون مجموعه را پاک می کند و همچنین خود عنصر پاک شده را به عنوان خروجی برگشت می دهد. در کد زیر چندین مرتبه متد ()pop اجرا شده و در هر گام عنصر اول مجموعه پاک می شود و سپس درون متغیری به نام item ذخیره خواهد شد.

حذف مقادیر تکراری از درون لیست

یکی از کاربردهای نوع ساختار مجموعه در پایتون برای حذف عناصری تکراری درون یک لیست است. مطابق کد زیر فرض می کنیم که یک لیست از رشته ها (نام شهرها) داریم و می خواهیم نام شهرهای تکراری را حذف کنیم، پس باید از لیست و توسط تابع ()set یک مجموعه ایجاد کنیم و نتیجه را در یک متغیر ذخیره کنیم. در نهایت توسط تابع ()list مجموعه ای که در متغیر unique_cities ذخیره شده است را به یک لیست تبدیل کرده ایم.

همانطور که گفتیم نظریه مجموعه ها در پیاده سازی پایگاه داده های رابطه ای کاربرد دارد. به طور مثال اگر بخواهیم فهرست شهرهایی که تمام کارمندها ساکن در آن شهرها هستند را پیدا کنیم باید از کوئری زیر و عبارت DISTINCT استفاه کنیم که از نظر عملکرد شبیه به دستور بالا است.

فرض می کنیم که در پایتون نوع ساختار مجموعه وجود ندارد و می خواستیم عناصر تکراری را حذف کنیم. کد زیر نمونه ای از حذف عناصر تکراری درون لیست را نشان می دهد.

منبع سورس کد

عملیات روی مجموعه ها

مطابق با مفاهیم ریاضی و شکل زیر چهار عملیات اجتماع (union)، اشتراک (intersection)، تفاضل (difference) و تفاضل متقارن (symmetric difference) بر روی هر مجموعه ای وجود دارد. شکل زیر نموادر ون (venn digram) هر یک از این چهار عملیات را نشان می دهد. در ادامه هر یک از این چهار عملیات روی مجموعه ها را معرفی و متدهای فراهم شده توسط پایتون که هر یک پیاده سازی این چهار عملیات هستند را معرفی خواهیم کرد.

۱ – اجتماع دو مجموعه

اجتماع دو مجموع A و B مجموعه جدیدی از عضوهای مجموعه A، مجموعه B و یا هر دو مجموعه است. هر شی از نوع ساختار داده set دارای متدی به نام ()union است که اجتماع دو مجموعه را بر می گرداند. در کد زیر دو مجموعه از رشته ها وجود دارد و توسط متد ()union اجتماع آنها در متغیری به نام union ذخیره شده است.

۲ – اشتراک دو مجموعه

اشتراک دو مجموع A و B مجموعه جدیدی از عضوهای مشترک مجموعه A و مجموعه B  است. هر شی از نوع ساختار داده set دارای متدی به نام ()intersection است که اجتماع دو مجموعه را بر می گرداند. در کد زیر دو مجموعه از رشته ها وجود دارد و توسط متد ()intersection اشتراک آنها در متغیری به نام intersection ذخیره شده است.

۳ – تفاضل دو مجموعه

تفاضل دو مجموعه A از B که آنرا به صورت A – B نمایش می دهند، مجموعه جدیدی است که شامل اعضای مجموعه A است ولی شامل اعضای B نیست. هر شی از نوع ساختار داده set دارای متدی به نام ()difference است که اجتماع دو مجموعه را بر می گرداند. در کد زیر دو مجموعه از رشته ها وجود دارد و توسط متد ()difference تفاضل آنها در متغیری به نام difference ذخیره شده است.

۴ – تفاضل متقارن

تفاضل متقارن دو مجموعه A از B که به صورت  نشان داده می شود، مجموعه‌ جدیدی از اعضای آنها است، به گونه‌ای که آن اعضا در یکی از دو مجموعه هست و در اشتراک آن دو وجود ندارد. هر شی از نوع ساختار داده set دارای متدی به نام ()symmetric_difference است که اجتماع دو مجموعه را بر می گرداند. در کد زیر دو مجموعه از رشته ها وجود دارد و توسط متد ()symmetric_difference تفاضل آنها در متغیری به نام symmetric_difference ذخیره شده است.

بررسی وجود عضو در مجموعه

برای بررسی وجود یا عدم وجود یک عضو در مجموعه به ترتیب باید از عملگرهای in و not in استفاده شود. کد زیر مثال ساده ای از عملگرهای in و not in را نمایش می دهد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *