آشنایی با Set ها در پایتون

آشنایی با Set ها در پایتون

آشنایی با Set ها در پایتون

در ادامه ی بررسی مجموعه ها در پایتون به نوع Set می رسیم. Set ها مجموعه هایی نامنظم و index نشده اند و برای نوشتن آن ها باید از curly braces (علامت {}) استفاده کرد. مثال:

thisset = {"apple", "banana", "cherry"}
print(thisset)

همانطور که بالاتر گفتم Set ها نامنظم هستند یعنی هیچ ترتیب خاصی در نمایش آن ها وجود ندارد. به طور مثال کد بالا ممکن است دارای خروجی های زیر باشد:

{'cherry', 'banana', 'apple'}

{'cherry', 'apple', 'banana'}

{'apple', 'banana', 'cherry'}

...و الی آخر

بنابراین در طول این جلسه این موضوع را تکرار نمی کنم و فقط خروجی هایی که برای خودم نمایش داده شده است (یکی از حالات مختلف) را برایتان قرار می دهم. مسئله ی دیگری که از این موضوع استنباط می شود این است که نمی توانیم برای دسترسی به اعضای Set از عدد index آن ها استفاده می کنیم؛ از آنجا که Set ها نامنظم هستند index ای هم ندارند که بخواهیم با آن به اعضای Set دسترسی داشته باشیم. به جای این کار باید با یک حلقه ی for درون Set گردش کنیم و سپس با استفاده از کلیدواژه ی in حضور یا عدم حضور یک عضو را بررسی کنیم:

thisset = {"apple", "banana", "cherry"}

for x in thisset:
  print(x)

مثالی از یک خروجی:

cherry
apple
banana

یا به طور مثال می گوییم آیا banana درون Set موجود است یا خیر:

thisset = {"apple", "banana", "cherry"}

print("banana" in thisset)

خروجی مقدار True خواهد بود.

نکته: زمانی که یک Set ساخته شود، امکان ویرایش اعضای قبلی وجود ندارد اما می توانید اعضای جدیدی به آن اضافه کنید.

اضافه کردن اعضا به Set

برای اضافه کردن یک تک عضو به Set بهتر است از متد ()add استفاده کنید اما برای اضافه کردن چندین عضو، تابع ()update کارساز تر است که ما برای هر دو حالت مثالی آورده ایم.

اضافه کردن یک عضو به Set:

thisset = {"apple", "banana", "cherry"}

thisset.add("orange")

print(thisset)

خروجی:

{'orange', 'cherry', 'apple', 'banana'}

اضافه کردن چندین عضو به Set:

thisset = {"apple", "banana", "cherry"}

thisset.update(["orange", "mango", "grapes"])

print(thisset)

خروجی:

{'apple', 'cherry', 'grapes', 'mango', 'banana', 'orange'}

همچنین هر زمان که خواستید تعداد اعضای Set های جدید خود را محاسبه کنید میتوانید به راحتی از همان متد ()len استفاده کنید:

thisset = {"apple", "banana", "cherry"}

print(len(thisset))

خروجی عدد 3 است چرا که 3 عضو در متغیر thisset داریم.

حذف اعضای Set

برای حذف کردن یک عضو از Set از یکی از دو تابع ()remove و ()discard استفاده کنید. به طور مثال اگر بخواهیم از ()remove استفاده کنیم باید بگوییم:

thisset = {"apple", "banana", "cherry"}

thisset.remove("banana")

print(thisset)

خروجی:

{'apple', 'cherry'}

همانطور که انتظار داشتیم banana حذف شده است. در صورتی که آیتم/عضو اعلام شده توسط شما برای حذف در Set پیدا نشود (وجود نداشته باشد)، تابع ()remove یک خطا یا error برمی گرداند.

روش دیگر نیز استفاده از ()discard می باشد:

thisset = {"apple", "banana", "cherry"}

thisset.discard("banana")

print(thisset)

خروجی:

{'apple', 'cherry'}

اگر عضو پاس داده شده به ()discard درون Set وجود نداشته باشد (به هر دلیلی) تابع ()discard برخلاف تابع ()remove، هیچ خطایی نمایش نخواهد داد.

سوال: آیا می توانیم از متد ()pop برای حذف اعضای Set استفاده کنیم؟

پاسخ: هم بله و هم نه! همانطور که می دانید ()pop آخرین عضو را حذف می کند اما از آنجایی که Set ها نامنظم هستند، عنصر آخر همیشه تغییر می کند بنابراین می توانید از ()pop استفاده کنید اما هیچ وقت نمی فهمید که کدام یک از اعضا را حذف خواهید کرد. به یاد داشته باشید که مقدار برگشت داده شده (returned) از ()pop همان عضو حذف شده خواهد بود:

thisset = {"apple", "banana", "cherry"}

x = thisset.pop()

print(x) #removed item

print(thisset) #the set after removal

خروجی:

banana
{'apple', 'cherry'}

همچنین تابع ()clear تمام اعضای Set را حذف میکند اما خود Set را باقی می گذارد. به زبان ساده تر این دستور Set را خالی می کند:

thisset = {"apple", "banana", "cherry"}

thisset.clear()

print(thisset)

اما از طرف دیگر کلیدواژه ی del (مخفف delete) تمام Set را حذف می کند. در دستور clear خودِ set حذف نمی شود بلکه فقط اعضا حذف می شوند اما با del خود set نیز حذف خواهد شد:

thisset = {"apple", "banana", "cherry"}

del thisset

print(thisset) #this will raise an error because the set no longer exists

خروجی:

NameError: name 'thisset' is not defined

ادغام Set ها با یکدیگر

راه های مختلفی برای ادغام set ها وجود دارد؛ به طور مثال دستور ()union دو set را ادغام کرده و نتیجه را در یک set کاملا جدید تحویل می دهد در حالی که دستور ()update تمام اعضای یک set را گرفته و در set دیگری قرار می دهد.

مثالی از کار با تابع ()union:

set1 = {"a", "b" , "c"}
set2 = {1, 2, 3}

set3 = set1.union(set2)
print(set3)

خروجی:

{'c', 2, 'b', 'a', 1, 3}

مثالی از کار با دستور ()update:

set1 = {"a", "b" , "c"}
set2 = {1, 2, 3}

set1.update(set2)
print(set1)

خروجی:

{1, 'a', 'b', 2, 'c', 3}

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

نکته: هر دو دستور ()update و ()union مقادیر تکراری را وارد set جدید نکرده و آن ها را نادیده می گیرند. البته متدهای دیگری برای کار با set ها وجود دارند که باید در سایت رسمی پایتون سری به آن ها بزنید. به طور مثال ()symmetric_difference تفاوت های بین دو set را به ما برمی گرداند؛ به عبارت دیگر فقط مقادیر غیرتکراری را برمی گردانند.

همچنین شما می توانید از یک constructor به نام ()set برای ساخت set ها استفاده کنید:

thisset = set(("apple", "banana", "cherry"))
print(thisset)

نتیجه می تواند هر کدام از موارد زیر باشد:

{'apple', 'banana', 'cherry'}

{'apple', 'cherry', 'banana'}

{'banana', 'cherry', 'apple'}

... و

این هم از دسته ی سوم مجموعه ها در پایتون... در قسمت بعدی به دسته ی چهارم مجموعه ها در پایتون به نام dictionary میرسیم و مفصلا در مورد آن ها صحبت خواهیم کرد.

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

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.