در این مقاله، مجموعه در پایتون «Set» مورد بحث و بررسی قرار میگیرند. در زبان برنامهنویسی پایتون، مجموعهها نوعی داده هستند که قابل تغییر «mutable» میباشند، به این معنی که پس از ایجاد آنها، میتوان عناصر جدیدی به مجموعه اضافه کرده یا از آنها حذف کرد. با این حال، عناصر داخل مجموعه باید غیرقابل تغییر «immutable» باشند؛ به این معنا که نمیتوان آنها را مستقیماً تغییر داد. بهعنوان مثال، نمیتوان یک لیست را به عنوان عضو مجموعه قرار داد، زیرا لیستها خود قابل تغییر هستند.
مجموعه در پایتون یک نوع دادهی بدون ترتیب «unordered» و قابل پیمایش «iterable» هستند. این به این معناست که ترتیب قرارگیری عناصر در مجموعه مهم نیست و نمیتوان به عناصر مجموعه از طریق ایندکس دسترسی پیدا کرد. علاوه بر این، مجموعهها هیچ عنصر تکراری ندارند و بهطور خودکار تکراریها را حذف میکنند. بنابراین، مجموعهها برای انجام عملیاتهایی مانند حذف تکراریها از دادهها یا بررسی عضویت در مجموعه مناسب هستند. در ادامه، با بررسی نحوهی ایجاد، افزودن، حذف و عملیات مختلف بر روی مجموعهها، به ویژگیهای این نوع داده در پایتون خواهیم پرداخت.
مقدمه
برای نمایش مجموعه در پایتون از آکولاد { } استفاده میشود که مقادیر درون آن قرار میگیرند. مزیت اصلی استفاده از مجموعه در پایتون بهجای لیست «List» این است که مجموعهها روشی بسیار بهینه برای بررسی وجود یک عنصر خاص در خود دارند.این ویژگی بهواسطه استفاده از ساختار دادهای به نام جدول درهمسازی یا هَش «Hash Table» فراهم میشود. همانطور که قبلاً نیز اشاره شد، مجموعهها بدون ترتیب هستند، پس نمیتوان مانند لیستها با استفاده از ایندکس، به عناصر آنها دسترسی داشت.
var = {"program", "store", "ahar"} type(var)
خروجی:
set
- پیچیدگی زمانی: O(1) برای عملیاتهای اصلی مانند افزودن یا بررسی وجود یک عنصر.
- فضای کمکی: O(1) برای عملیاتهایی که نیازی به داده اضافی ندارند.
تغییر نوع داده ای مجموعه با متد ()set در پایتون
متد set() در پایتون برای تبدیل نوع دادهها به مجموعه استفاده میشود. با استفاده از این تابع، میتوان دادههایی مانند لیست، رشته یا تاپل را به مجموعه تبدیل کرد. پس از تبدیل، دادهها به یک مجموعه «set» تبدیل میشوند که ویژگیهای خاص مجموعهها را دارند، از جمله عدم ترتیب و عدم تکراری بودن عناصر.
# typecasting list to set myset = set(["a", "b", "c"]) print(myset) # Adding element to the set myset.add("d") print(myset)
خروجی:
{'c', 'b', 'a'} {'d', 'c', 'b', 'a'}
- پیچیدگی زمانی: O(n)، زیرا تبدیل نوع نیاز به پردازش تمام عناصر دارد.
- فضای کمکی: O(n)، برای ذخیره مجموعه جدید.
بررسی یکتا بودن و غیرقابل تغییر بودن عناصر مجموعه در پایتون
- مجموعه در پایتون نمیتواند مقادیر تکراری داشته باشد، به این معنی که همه عناصر موجود در یک مجموعه باید یکتا «unique» باشند. اگر دادههایی که به مجموعه افزوده میشوند، شامل عناصر تکراری باشند، پایتون بهطور خودکار این تکراریها را حذف کرده و تنها یک نسخه از هر عنصر را در مجموعه نگه میدارد.
- عناصر موجود در مجموعهها در پایتون قابل تغییر نیستند «immutable». به این معنی که نمیتوانیم خود عناصر مجموعه را تغییر دهیم. برای مثال، نمیتوانیم یک عنصر از مجموعه را به یک مقدار جدید تغییر دهیم. با این حال، کل مجموعه قابل تغییر است و میتوانیم عناصر جدید به آن اضافه کنیم یا از آن حذف کنیم.
# Python program to demonstrate that # a set cannot have duplicate values # and we cannot change its items # a set cannot have duplicate values myset = {"Program", "Store"} print(myset) # values of a set cannot be changed myset[1] = "Hello" print(myset)
خروجی:
اولین مثال نشان میدهد که مجموعه در پایتون نمیتواند مقادیر تکراری داشته باشد؛ هر آیتم در مجموعه یکتا است.
دومین مثال خطایی تولید میکند زیرا پس از ایجاد یک مجموعه، نمیتوانیم مقادیر را به طور مستقیم تغییر دهیم یا به عناصر آن مقدار جدیدی اختصاص دهیم. با این حال، امکان اضافه یا حذف آیتمها در مجموعه وجود دارد.
Traceback (most recent call last): File "./prog.py", line 10, in <module> TypeError: 'set' object does not support item assignment
عناصر ناهمگن مجموعه در پایتون
مجموعهها در پایتون میتوانند عناصر ناهمگن «heterogeneous» را ذخیره کنند، به این معنی که یک مجموعه میتواند ترکیبی از انواع مختلف دادهها مانند رشتهها، عدد صحیحها، مقادیر بولی، و غیره را در خود جای دهد. این ویژگی به مجموعهها این امکان را میدهد که دادههای مختلف با انواع مختلف را در یک مجموعه ذخیره کنند.
# Python example demonstrate that a set # can store heterogeneous elements myset = {"program", "store", 10, 52.7, True} print(myset)
خروجی:
{True, 10, 'program', 52.7, 'store'}
- پیچیدگی زمانی: O(n) برای ایجاد یک مجموعه منجمد.
- فضای کمکی: O(n) برای ذخیره مجموعه منجمد.
مجموعههای منجمد (Frozen Sets) در پایتون
مجموعههای منجمد در پایتون «Frozen sets» اشیائی غیرقابل تغییر «immutable» هستند که تنها از روشها و عملگرهایی پشتیبانی میکنند که بدون تأثیرگذاری بر مجموعه، نتیجهای جدید تولید میکنند. به عبارت دیگر، پس از ایجاد یک مجموعه منجمد، نمیتوان هیچگونه تغییری در آن ایجاد کرد، مانند افزودن یا حذف عناصر. با این حال، میتوان از عملیاتهایی مانند اتحاد، اشتراک، تفاضل و دیگر عملگرها برای ایجاد مجموعههای جدید استفاده کرد.
این ویژگی با استفاده از متد ()frozenset در پایتون قابل دستیابی است.
- عناصر یک مجموعه معمولی در هر زمان قابل تغییر هستند اما عناصر یک مجموعه منجمد پس از ایجاد ثابت باقی میمانند.
- اگر هیچ پارامتری به متد ()frozenset داده نشود، یک مجموعه منجمد خالی بازمیگرداند.
# Python program to demonstrate differences # between normal and frozen set # Same as {"a", "b","c"} normal_set = set(["a", "b","c"]) print("Normal Set") print(normal_set) # A frozen set frozen_set = frozenset(["e", "f", "g"]) print("\nFrozen Set") print(frozen_set) # Uncommenting below line would cause error as # we are trying to add element to a frozen set # frozen_set.add("h")
خروجی:
Normal Set {'b', 'c', 'a'} Frozen Set frozenset({'g', 'e', 'f'})
- پیچیدگی زمانی: O(n) برای عملیاتهایی که نیاز به پردازش تمام عناصر دارند.
- فضای کمکی: O(n) برای ذخیره ساختار داده مربوط به مجموعه.
عملکرد داخلی مجموعه در پایتون
- مجموعهها بر اساس یک ساختار داده به نام جدول درهمسازی (Hash Table) پیادهسازی میشوند.
- اگر مقادیر متعددی در یک موقعیت ایندکس مشابه ذخیره شوند، این مقادیر به صورت یک لیست پیوندی (Linked List) در آن موقعیت ذخیره میشوند.
- مجموعه در پایتون با استفاده از دیکشنریها با مقادیر پیشفرض (dummy variables) پیادهسازی شدهاند. در این ساختار:
- کلیدها به عنوان اعضای مجموعه در پایتون عمل میکنند.
- این روش باعث بهینهسازی بیشتر پیچیدگی زمانی در عملیاتهای مختلف مجموعه میشود.
پیادهسازی مجموعهها (Set Implementation)
مجموعهها با عملیات متعدد بر روی یک جدول درهمسازی
مجموعهها در پایتون با استفاده از یک جدول درهمسازی «Hash Table» مدیریت میشوند، که به مجموعهها این امکان را میدهد که عملیاتهای مختلف را بهطور مؤثر و با پیچیدگی زمانی ثابت انجام دهند. این جدول درهمسازی هر عنصر از مجموعه را بهصورت منحصر به فرد با استفاده از یک تابع هش «Hash Function» ذخیره میکند. از آنجایی که دسترسی به عناصر در جدول درهمسازی با استفاده از مقدار هش انجام میشود، عملیاتهایی مانند جستجو، افزودن و حذف عناصر بهطور بسیار سریع و کارآمد انجام میشود.
روشهای کار با مجموعه در پایتون
در ادامه مقاله، به بررسی روشهای مختلف کار با مجموعهها در پایتون میپردازیم. این روشها شامل اضافه کردن عناصر به مجموعه، اتحاد مجموعهها، اشتراک مجموعهها و تفاوت مجموعهها هستند. این عملیاتها از ویژگیهای مهم مجموعهها در پایتون هستند و بهطور گسترده در برنامهنویسی برای پردازش دادهها استفاده میشوند.
اضافه کردن عناصر به مجموعه
برای افزودن عناصر به مجموعه در پایتون، از متد ()add استفاده میشود. در این فرآیند، یک عنصر به مجموعه اضافه میشود و اگر آن عنصر قبلاً در مجموعه موجود باشد، هیچ تغییری در مجموعه ایجاد نخواهد شد، زیرا مجموعهها تنها عناصری یکتا را نگهداری میکنند.
- یک مقدار مناسب ایجاد شده و در جدول درهمسازی ذخیره میشود.
- بررسی وجود آیتم و افزودن آن به مجموعه در حالت عادی با پیچیدگی زمانی O(1) انجام میشود.
- اما در بدترین حالت ممکن است به O(n) برسد، مثلا زمانی که جدول درهمسازی باید بازسازی شود.
این روش باعث میشود مجموعه در پایتون برای ذخیرهسازی و مدیریت دادههای غیرتکراری بسیار کارآمد باشند.
# A Python program to # demonstrate adding elements # in a set # Creating a Set people = {"Jay", "Idrish", "Archi"} print("People:", end = " ") print(people) # This will add Daxit # in the set people.add("Daxit") # Adding elements to the # set using iterator for i in range(1, 6): people.add(i) print("\nSet after adding element:", end = " ") print(people)
خروجی:
People: {'Idrish', 'Jay', 'Archi'} Set after adding element: {1, 'Archi', 2, 3, 4, 5, 'Jay', 'Idrish', 'Daxit'}
پیچیدگی زمانی: O(len(s1) + len(s2))، زیرا تمام عناصر هر دو مجموعه باید پیمایش شوند.
فضای کمکی: O(n) برای ذخیره مجموعه جدید.
اتحاد مجموعه در پایتون
برای ترکیب دو مجموعه میتوان از متد ()union یا عملگر | استفاده کرد. در این عملیات:
- مقادیر هر دو جدول درهمسازی (Hash Table) خوانده و پیمایش میشوند.
- عناصر با هم ترکیب میشوند و مقادیر تکراری حذف میگردند.
این روش برای انجام عملیات اتحاد بین مجموعه در پایتون سریع و کارآمد است.
# Python Program to # demonstrate union of # two sets people = {"Jay", "Idrish", "Archil"} vampires = {"Karan", "Arjun"} dracula = {"Deepanshu", "Raju"} # Union using union() # function population = people.union(vampires) print("Union using union() function") print(population) # Union using "|" # operator population = people|dracula print("\nUnion using '|' operator") print(population)
خروجی:
Union using union() function {'Karan', 'Archil', 'Arjun', 'Idrish', 'Jay'} Union using '|' operator {'Archil', 'Deepanshu', 'Idrish', 'Jay', 'Raju'}
پیچیدگی زمانی: O(min(len(s1), len(s2))) ، زیرا فقط کوچکترین مجموعه پیمایش میشود.
فضای کمکی: O(n) برای ذخیره مجموعه جدید شامل عناصر مشترک.
اشتراک مجموعه در پایتون
برای پیدا کردن اشتراک دو مجموعه در پایتون، میتوان از متد ()intersection یا عملگر & استفاده کرد. در این عملیات، عناصری که در هر دو مجموعه مشترک هستند، استخراج میشوند.
- عناصر مشترک بین دو مجموعه انتخاب میشوند.
- این فرآیند مشابه پیمایش لیستهای جدول درهمسازی و ترکیب مقادیر یکسان در هر دو جدول است.
این روش سریع و کارآمد برای پیدا کردن عناصر مشترک در دو مجموعه است.
# Python program to # demonstrate intersection # of two sets set1 = set() set2 = set() for i in range(5): set1.add(i) for i in range(3,9): set2.add(i) # Intersection using # intersection() function set3 = set1.intersection(set2) print("Intersection using intersection() function") print(set3) # Intersection using # "&" operator set3 = set1 & set2 print("\nIntersection using '&' operator") print(set3)
خروجی:
Intersection using intersection() function {۳, ۴} Intersection using '&' operator {۳, ۴}
پیچیدگی زمانی:O(len(s1))، زیرا تمام عناصر مجموعه اول پیمایش میشوند.
فضای کمکی:O(n) برای ذخیره مجموعهای شامل عناصر تفاوت.
تفاوت های مجموعه در پایتون
برای پیدا کردن تفاوت بین دو مجموعه میتوان از متد ()difference یا عملگر – استفاده کرد. در این فرآیند:
- عناصری از مجموعه اول (s1) که در مجموعه دوم (s2) وجود ندارند، انتخاب میشوند.
- این عملیات شبیه به پیدا کردن تفاوت در لیستهای پیوندی (Linked Lists) است.
این روش برای یافتن عناصر منحصربهفرد مجموعه اول نسبت به مجموعه دوم بهینه و سریع است.
# Python program to # demonstrate difference # of two sets set1 = set() set2 = set() for i in range(5): set1.add(i) for i in range(3,9): set2.add(i) # Difference of two sets # using difference() function set3 = set1.difference(set2) print(" Difference of two sets using difference() function") print(set3) # Difference of two sets # using '-' operator set3 = set1 - set2 print("\nDifference of two sets using '-' operator") print(set3)
خروجی:
Difference of two sets using difference() function {۰, ۱, ۲} Difference of two sets using '-' operator {۰, ۱, ۲}
دو محدودیت اصلی مجموعه در پایتون:
- مجموعه ترتیب عناصر را حفظ نمیکند.
- فقط عناصر از نوعهای غیرقابل تغییر (Immutable) میتوانند به مجموعه اضافه شوند.
نتیجه گیری
مجموعه در پایتون ابزاری مفید برای ذخیره و مدیریت دادهها هست که از عناصر یکتا و بدون ترتیب تشکیل شدهاست. آنها امکانات زیادی برای انجام عملیات مختلف مانند اتحاد، اشتراک، تفاضل و تفاضل متقابل فراهم میکنند. با استفاده از مجموعه در پایتون میتوانیم به راحتی دادههای تکراری را حذف کنیم، عضویت را بررسی کنیم و عملیات ریاضی مجموعهها را انجام دهیم. مهمترین ویژگی مجموعهها این است که سرعت بالا در دسترسی به عناصر دارند و برای بسیاری از مسائل برنامهنویسی مفید و کارآمد هستند.