آموزش کار با مجموعه در پایتون (Python Set)

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

اگر بخواهم مجموعه‌های پایتون (python set) ‌را خیلی ساده معرفی کنم، شما را به نظریه مجموعه‌ها در ریاضی ارجاع می‌دهم! مطمئناً در درس ریاضی با مجموعه‌ها آشنا شده‌اید. اگر هم الآن حضور ذهن ندارید، جای هیچ نگرانی نیست.

در مجموعه‌ها گروهی از عناصر را نگهداری می‌کنیم. می‌توان به هر مجموعه اعضای جدید اضافه کرد یا اعضای قبلی را حذف کرد ولی اعضای موجود را نمی‌توان تغییر داد. همچنین بین دو مجموعه عملگرهای مختلفی تعریف می‌شوند؛ عملگرهایی نظیر اجتماع، اشتراک، تفاضل.

نمایش نمودار ون (Venn) مجموعه
نمایش نمودار ون (Venn) مجموعه

در برنامه‌نویسی پایتون نیز از مجموعه‌ها دقیقاً به همین منظور استفاده می‌شود. ابتدا با ویژگی‌های set در پایتون آشنا شده و نحوه تعریف آن را یاد می‌گیریم. سپس توابع اصلی کار با مجموعه را معرفی خواهم کرد.

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

set یک ساختمان داده built-in است.اعضای یک مجموعه پایتون دارای سه ویژگی اصلی زیر هستند:

  • نامرتب (unordered)
  • غیرقابل تغییر (unchangeable)
  • غیر تکراری (non-duplicate)

منظور از نامرتب بودن این است که نمی‌توان ترتیب خاصی برای عناصر درون مجموعه در نظر گرفت. علاوه بر این، مجموعه برخلاف لیست در پایتون دارای اندیس (ایندکس) نیستند. در نتیجه نمی‌توان به یکی از اعضای آن به وسیله اندیس دسترسی داشت.

اعضای یک مجموعه غیر قابل تغییر هستند؛ بنابراین نمی‌توان یک مقدار را تغییر داد. در حقیقت چون نمی‌توانیم به یک عنصر مشخص دسترسی داشته باشیم، نمی‌توانیم آن را تغییر دهیم.

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

تعریف مجموعه پایتون

دو نوع ساختار تعریف برای set در پایتون داریم. زمانی از اولین حالت استفاده می‌کنیم که حداقل یک مقدار از مجموعه را در اختیار داشته باشیم. برای تعریف مجموعه، از علامت آکولاد استفاده می‌شود. با { مجموعه را شروع کرده و با } خاتمه می‌دهیم. هر عضو در مجموعه نیز با استفاده از کاما (,) از یکدیگر جدا می‌شوند.

num_set = {17, 81, 4, 11}
str_set = {"Negar", "Omid", "Ehsan"}

برای تعریف مجموعه نمی‌توانیم به طور تنها از علامت {} استفاده کنیم. برعکس لیست‌ها که با گذاشتن [] هم تعریف می‌شدند، اگر فقط از آکولاد استفاده کنیم، یک دیکشنری پایتونی خواهیم داشت. به کد زیر دقت کنید:

my_set = {17, 81, 4, 11}
print( type(my_set) )   # <class 'set'>

test = {}
print( type(test) )   # <class 'dict'>

روش دوم برای تعریف مجموعه در پایتون استفاده از سازنده set() است. با صدا زدن این تابع، یک مجموعه خالی ایجاد می‌شود که به کمک توابعی که در قسمت بعدی می‌بینیم خواهیم توانست مقادیر جدیدی به آن اضافه کنیم.

X = set()

تابع set() می‌تواند به عنوان ورودی یک مجموعه داده تکرارگر یا iterator در پایتون دریافت کند. داده‌های تکرارگر داده‌هایی هستند که قابل پیمایش هستند. بنابراین می‌توانیم یک لیست، تاپل یا رشته را به عنوان ورودی این تابع داده و آن را به مجموعه تبدیل کنیم.

lst = ["Shiraz", "Tehran", "Tabriz", "Mashhad"]
cities = set(lst)
print(cities)
# outpuut:
# {'Mashhad', 'Tabriz', 'Tehran', 'Shiraz'}

می‌توان به جای لیست، یک رشته متنی را به set() داده و مجموعه‌ای از کاراکترهای یکتای رشته مورد نظر را دریافت کنیم.

site_name = "SabzDanesh.com"
site_chars = set(site_name)
print(site_chars)
# output:
# {'s', 'h', 'z', 'D', 'n', 'e', 'c', 'S', '.', 'a', 'o', 'm', 'b'}

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

یادآوری می‌کنم که ویژگی‌های اصلی مجموعه در پایتون (Python Set) نامرتب بودن، غیرتکراری بودن و غیر قابل تغییر بودن اعضای مجموعه است. این نوع داده‌ای مبتنی بر ساختمان داده جدول هش (Hash Table) است.

کار با مجموعه‌های پایتون

داده‌هایی که در یک مجموعه قرار می‌دهیم می‌توانند از یک نوع یا نوع‌های مختلف باشند. برای مثال در قطعه کد زیر می‌بینید که سه set مختلف با داده‌های متنوع ایجاد شده است.

my_set1 = {6, 17, 28}
my_set2 = {"omid", 2557, "sabzdanesh", (2,5)}
my_set3 = {2.4, "Hello", (4,7,9)}

گفتم که اعضای مجموعه در پایتون تغییر ناپذیر (immutable) هستند. به این معنی که مقدار یک عنصر را در مجموعه نمی‌توان تغییر داد. اما توجه کنید که set در پایتون تغییر پذیر است. یعنی می‌توانیم اعضای جدیدی به آن اضافه کرده یا برخی از اعضا را حذف کنیم. در ادامه با توابعی آشنا می‌شویم که چنین کارهایی انجام خواهند داد.

یادآور می‌شوم که نمی‌توانیم به طور مستقیم و از طریق index به اعضای موجود در مجموعه دسترسی داشته باشیم.

معمولاً یکی از کارهایی که با داده‌های مجموعه‌ای انجام می‌دهیم، محاسبه اندازه آن‌هاست. منظور از اندازه، تعداد اعضای درون یک مجموعه است. برای محاسبه اندازه مجموعه در پایتون از تابع len() استفاده می‌کنیم.

فقط کافی است set را به عنوان ورودی به این تابع بدهیم تا تعداد اعضای مجموعه را داشته باشیم.

city_set = {"Shiraz", "Tehran", "Tabriz", "Mashhad", "Isfahan"}
print( len(city_set) )
# output:
# 5

بررسی موجود بودن عضو set

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

برای اینکه وجود یک مقدار در set را بررسی کنیم، از کلمه کلیدی in استفاده می‌کنیم. به مثال زیر توجه کنید:

print( "Shiraz" in city_set )
# output:
# True

test_set = {1, 2, 3, 5, 8}
if 7 in test_set:
    print("Yes!")
else:
    print("No!")

در قسمت دوم این کد، پس از تعریف مجموعه test_set، در یک شرط if بررسی کرده‌ایم که آیا مقدار 7 در مجموعه قرار دارد یا خیر. با اجرای کد، مقدار No! چاپ می‌شود.

برای اینکه عدم وجود عنصر در مجموعه را بررسی کنیم، از عبارت not in استفاده خواهیم کرد. در قطعه کد زیر، عدم وجود nazanin در مجموعه را بررسی کرده‌ایم:

names_set = {"negar", "omid", "roya", "ehsan", "roya"}
if "nazanin" not in names_set:
    print("OK!")

سؤال: در تعریف این مجموعه، اسم roya دو بار تکرار شده است. اگر مقدار names را چاپ کنیم، خواهیم دید که خروجی شبیه تصویر زیر است. به نظر شما چرا ؟!

نتیجه چاپ names_set برای تکرار اعضا
نتیجه چاپ names_set

افزودن عضو به مجموعه

گفتیم برخلاف عناصر مجموعه، خود مجموعه‌ها قابل تغییر هستند. برای افزودن یک عضو جدید به مجموعه در پایتون از متد add() استفاده می‌کنیم. این متد به صورت تابعی روی نوع داده مجموعه تعریف شده است.

بنابراین برای استفاده از آن، باید متد را روی مجموعه مورد نظر صدا بزنیم. این متد یک ورودی می‌گیرد که مقدار عنصر جدید را مشخص می‌کند.

test_set.add(11)   # {1, 2, 3, 5, 8, 11}

گاهی نیاز داریم چند عضو جدید را از یک لیست به مجموعه خود اضافه کنیم. روش اول استفاده از یک حلقه for برای افزودن همه عناصر list به set است.

روش دوم و بهتر، استفاده از متد update() است. این متد یک لیست را به عنوان ورودی گرفته و تمام اعضای آن را به مجموعه ما اضافه می‌کند.

new_nums = [9, 15, 13]
test_set.update(new_nums)

print( test_set )
# {1, 2, 3, 5, 8, 9, 11, 13, 15}

حذف از set پایتون

برای حذف یک عنصر از مجموعه در پایتون از متدهای discard() و remove() استفاده می‌شود. این دو متد یک مقدار را به عنوان ورودی گرفته و از درون مجموعه مورد نظر ما حذف می‌کنند.

این دو متد تنها یک تفاوت با هم دارند: اگر مقدار مورد نظر در مجموعه وجود نداشته باشد، discard() هیچ کار خاصی انجام نمی‌دهد اما remove() خطا (error) می‌دهد.

test_set.remove(8)
# {1, 2, 3, 5, 9, 11, 13, 15}

test_set.remove(7) # Error!

test_set.discard(7)
# {1, 2, 3, 5, 9, 11, 13, 15}
مدیریت خطا در پایتون (استثنا یا Exception)

مدیریت خطا در پایتون (استثنا یا Exception)

عملگرهای مجموعه در پایتون

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

در این جا برای درک ساده‌تر مثال‌ها، از عناصر عددی استفاده می‌کنم. اما نوع‌های داده‌ای مجموعه‌ها هر چیزی می‌توانند باشند. (بیشتر بیاموزید: کار با عدد در پایتون) دو مجموعه A و B را در نظر بگیرید:

A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

اجتماع دو مجموعه (union)

اجتماع دو مجموعه عبارت است از مجموعه‌ای از تمام اعضای هر دو مجموعه. برای اجتماع‌گیری روی مجموعه‌ها در پایتون از عملگر | یا متد union() استفاده می‌شود.

عملگر | بین دو مجموعه قرار می‌گیرد و مشابه عملگرهای ریاضی، نتیجه نهایی را به ما خواهد داد. متد union() روی یکی از مجموعه‌ها صدا زده شده و مجموعه دیگر به عنوان ورودی به آن داده می‌شود.

A_union_B = A | B
# A_union_B = {1, 2, 3, 4, 5, 6, 7, 8}

print( A.union(B) )
# {1, 2, 3, 4, 5, 6, 7, 8}
نمودار عمل اجتماع بین دو مجموعه
نمودار عمل اجتماع بین دو مجموعه

تفاضل دو مجموعه در پایتون

تفاضل یا تفاوت مجموعه B از A یک مجموعه از تمام اعضایی است که فقط در A قرار دارند. به عبارت دیگر اعضایی از A که در B حضور ندارند.

برای محاسبه تفاوت دو set از عملگر تفریق (-) یا متد difference() استفاده می‌شود. به مثال زیر توجه کنید:

print( A - B )
# print( A - B )

print( A.difference(B) )
# {1, 2, 3}

print( B.difference(A) )
# {8, 6, 7}
نمودار تفاضل دو set
نمودار تفاضل دو set

دقت کنید که در حالت عمومی مجموعه A-B برابر B-A نیست.

اشتراک مجموعه (intersection)

اشتراک دو مجموعه، مجموعه‌ای از اعضایی است که در هر دو مجموعه حضور دارند. در صورتی که دو مجموعه هیچ عنصر مشترکی نداشته باشند، اشتراک آن‌ها خالی (تهی) خواهد بود.

برای انجام عملیات اشتراک روی دو مجموعه در پایتون از عملگر & یا متد intersection() استفاده می‌شود.

print( A & B )
# {4, 5}

print( A.intersection(B) )
# {4, 5}
نمودار عملیات اشتراک بین دو مجموعه
نمودار عملیات اشتراک بین دو مجموعه

اگر مایلید تمام عملگرها و متدهای قابل اجرا روی مجموعه‌ها در پایتون را بررسی کنید، به جدول موجود در این لینک مرجع مراجعه کنید.

این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش پایتون