پایتون کلید ورود به دنیای هوش مصنوعی! (گام دوم- قسمت دوازدهم :مجموعه ها)

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

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

مجموعه ها در پایتون دقیقا عین مجموعه ها در ریاضی هستن. چند تا نکته هست که در مجموعه ها باید به آن توجه کنیم .

نکته اول اینه که ترتیب در مجموعه ها مهم نیست یعنی این که کدوم عنصر اول باشه کدوم دوم اهمیتی نداره!

نکته دوم اینه که نمی تونیم عنصر تکراری در مجموعه ذخیره کنیم یعنی مثالا نمی تونیم همچین چیزی داشته باشیم :

s={1,1,2}

نکته سوم این که عناصر مجموعه immutable هستن همون طور که در این لینک توضیح دادیم یعنی اینکه تغییر ناپذیرند. در واقع در مثال بالا نمی تونیم جای ۲ عدد ۳ رو بزاریم.

نکته چهارم این که خود مجموعه ولی mutable هست یعنی خود مجموعه می تونه تغییر کنه در واقع می تونیم بهش مقدار اضافه کنیم یا ازش کم کنیم.

اضافه کردن و حذف کردن در مجموعه

برای اضافه کردن از دستور add استفاده می شه مثل مثال زیر که عدد ۴ رو به مجموعه اضافه می کنه :

s = {1,2,3}
 s.add(4) # s == {1,2,3,4}

برای حذف کردن هم از remove یا discard میشه استفاده کرد. تفاوت این دو هم نشان داده شده همانطور که می بینید دستور discard اگر عنصر مورد نظر وجود نداشته باشد خطا نمی دهد ولی دستور remove اگر عنصر مورد نظر وجود نداشته باشد خطا می دهد.

s.discard(3) # s == {1,2,4} 
s.discard(5) # s == {1,2,4} 
s.remove(2) # s == {1,4} 
s.remove(2) # KeyError!

چک کردن وجود عنصر در مجموعه

در خیلی از کاربرد ها نیاز است که چک کنیم که یک عنصر در یک مجموعه وجود داره یا خیر که این کارو میشه با دستور in انجام داد.

# Existence check 
2 in {1,2,3} # True 
4 in {1,2,3} # False 
4 not in {1,2,3} # True

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

اشتراک

اگر یادتون باشه در ریاضی یک سری کار روی مجموعه ها می تونستیم انجام بدیم مثل اشتراک / اجتماع /تفاضل و زیر مجموعه و ... . در پایتون هم همین کارهارو می شه کرد. مثالا اگر بخواهیم اشتراک دوتا مجموعه رو در بیاریم از intersection استفاده می کنیم یا اینکه می تونیم دوتا مجموعه رو باهم & کنیم مثلا در مثال زیر ۳و۴و۵ مشترک هستند :

# Intersection 
{1, 2, 3, 4, 5}.intersection({3, 4, 5, 6}) # {3, 4, 5} 
{1, 2, 3, 4, 5} # {3, 4, 5}

اجتماع

اگر بخواهیم اجتماع دوتا مجموعه رو دربیاریم از Union استفاده می کنیم یا اینکه می شه دو مجموعه را باهم or کرد و از | استفاده کرد.

# Union 
{1, 2, 3, 4, 5}.union({3, 4, 5, 6}) # {1, 2, 3, 4, 5, 6} 
{1, 2, 3, 4, 5} | {3, 4, 5, 6} # {1, 2, 3, 4, 5, 6}

تفاضل

اگر بخواهیم تفاضل دو مجموعه رو در بیاریم یعنی اینکه اون چیزیایی که در مجموعه دوم هست رو از مجموعه اول کم کنیم از diffrence استفاده می کنیم که میشه از علامت تفریق هم استفاده کرد:

# Difference {1, 2, 3, 4}.difference({2, 3, 5}) # {1, 4} 
{1, 2, 3, 4} - {2, 3, 5} # {1, 4}

تفاضل متقارن

این حالت مثل تفاضل هست با این تفاوت عنصر هایی که در مجموعه اول وجود ندارند هم اضافه می شود. مثلا عدد ۵ چون وجود نداره در مجموعه اول اضافه شده . از symmetric_difference یا ^ استفاده می کنیم.

# Symmetric difference with 
{1, 2, 3, 4}.symmetric_difference({2, 3, 5}) # {1, 4, 5} 
{1, 2, 3, 4} ^ {2, 3, 5} # {1, 4, 5}

عمل superset

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

# Superset check 
{1, 2}.issuperset({1, 2, 3}) # False {1, 2} >= {1, 2, 3} # False

زیر مجموعه

این که یک مجموعه ای آیا به مجموعه دیگه تعلق داره یا نه که این رو میشه با کوچکتر مساوی یا دستور issubsetچک کرد.

# Subset check 
{1, 2}.issubset({1, 2, 3}) # True {1, 2} <= {1, 2, 3} # True

عمل disjoint

در واقع چک می کنه آیا دو مجموعه اشتراکی دارند یا خیر. که میشه از isdisjoint برای اینکار استفاده کرد.

# Disjoint check 
{1, 2}.isdisjoint({3, 4}) # True 
{1, 2}.isdisjoint({1, 4}) # False

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

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

list(set(restaurants))

مجموعه ای از مجموعه ها

شاید توی مسئله برای ما پیش بیاد بخواهیم چند تا مجموعه رو بریزیم توی یک مجموعه اولین چیزی که به ذهنمون می رسه اینه :

Set of Sets
{{1,2}, {3,4}}

اما با همچین اروری مواجه می شیم:

Traceback (most recent call last):
 File &quot<stdin>&quot, line 1, in <module>
 TypeError: unhashable type: 'set'

که مرتبط با unhashable بودن نوع داده مجموعه هست که در درس های بعدی راجب اینکه hashable چیه صحبت می کنم و لینکشو اینجا می زارم.

برای حل این مشکل از frozenset استفاده میشه :

{frozenset({1, 2}), frozenset({3, 4})}

مجموعه خالی

اگر بخواهیم یک مجموعه خالی تعریف کنیم {} و از این استفاده کنیم اشتباهه چون که این برای ما یک دیکشنری خالی بر می گردونه. برای مجموعه خالی از ()set استفاده می کنیم.

کلام آخر

گاهی نیاز داریم داده خودمون رو در مجموعه نگه داریم و تکراری هم داریم مثل :

>>> setA = {'a','b','b','c'}

یه راه اینه که بیایم از لیست ها استفاده کنیم ولی بعضی وقت ها ترتیبی بودن عناصر هم برای مهم نیست فقط می خواهیم بدونیم هر عنصر چیه و چند بار اومده . برای اینکار می تونیم از ماژول collection تابع counter را استفاده کنیم. داریم :

>>> from collections import Counter 
>>> counterA = Counter(['a','b','b','c']) 
>>> counterA 
Counter({'b': 2, 'a': 1, 'c': 1})

همونطور که می بینید این دستور به صورت دیکشنری اطلاعات رو ذخیره می کنه.

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

درس بعدی در مورد تاپل ها صحبت می کنیم که از لینک زیر می تونید بخونید

https://virgool.io/hooshteam/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%DA%A9%D9%84%DB%8C%D8%AF-%D9%88%D8%B1%D9%88%D8%AF-%D8%A8%D9%87-%D8%AF%D9%86%DB%8C%D8%A7%DB%8C-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%DA%AF%D8%A7%D9%85-%D8%AF%D9%88%D9%85-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%DB%8C%D8%B2%D8%AF%D9%87%D9%85-%D8%AA%D8%A7%D9%BE%D9%84-%D9%87%D8%A7-cdekwdh64fkz