در زبان برنامهنویسی پایتون، یک مجموعه (Set) مجموعهای نامرتب از انواع داده است که قابل حلقه زنی یا قابل تکرار (iterable) و قابل تغییر (mutable) بوده و عناصر تکراری ندارد. ترتیب عناصر در یک مجموعه تعریف نشده است، اگرچه ممکن است از انواع مختلفی از داده ها تشکیل شده باشد.
مزیت اصلی استفاده از یک مجموعه نسبت به یک لیست در پایتون، وجود یک متد بسیار بهینهسازی شده برای بررسی وجود یک عنصر خاص در مجموعه مورد نظر است.
ایجاد یک مجموعه
مجموعه ها در پایتون میتوانند با استفاده از تابع داخلی ()set با یک شیء قابل حلقه زنی (iterable) و یا با یک دنباله از اشیاء در حالی که در داخل آکولادهای باز و بسته ({ }) قرار دارند و با ‘ویرگول’ از هم جدا شده اند، ساخته شوند.
توجه: یک مجموعه نمیتواند عناصر قابل تغییری (mutable) مانند یک لیست یا دیکشنری داشته باشد، زیرا مجموعه قابل تغییر (mutable) است.
# Python program to demonstrate # Creation of Set in Python # Creating a Set set1 = set() print("Initial blank Set: ") print(set1) # Creating a Set with # the use of a String set1 = set("datayadforyou") print("\nSet with the use of String: ") print(set1) # Creating a Set with # the use of Constructor # (Using object to Store String) String = 'datayadforyou' set1 = set(String) print("\nSet with the use of an Object: " ) print(set1) # Creating a Set with # the use of a List set1 = set(["datayad", "For", "you"]) print("\nSet with the use of List: ") print(set1) # Creating a Set with # the use of a tuple t=("datayad","for","you") print("\nSet with the use of Tuple: ") print(set(t)) # Creating a Set with # the use of a dictionary d={"datayad":1,"for":2,"you":3} print("\nSet with the use of Dictionary: ") print(set(d))
خروجی:
Initial blank Set: set() Set with the use of String: {'f', 'r', 'a', 'o', 'y', 'd', 't', 'u'} Set with the use of an Object: {'f', 'r', 'a', 'o', 'y', 'd', 't', 'u'} Set with the use of List: {'For', 'datayad'} Set with the use of Tuple: {'for', 'datayad'} Set with the use of Dictionary: {'for', 'datayad'}
پیچیدگی زمانی: O(n)، که n طول رشته ورودی، لیست، تاپل یا دیکشنری است.
فضای کمکی: O(n)، که n طول رشته ورودی، لیست، تاپل یا دیکشنری است، زیرا اندازه مجموعه ایجاد شده وابسته به اندازه ورودی است.
یک مجموعه فقط شامل عناصر منحصر به فرد است، اما در زمان ایجاد مجموعه، ممکن است مقادیر تکراری چندین بار نیز ارسال شوند.
ترتیب عناصر در یک مجموعه تعریف نشده و تغییرناپذیر است. نوع عناصر در یک مجموعه نیازی به یکسان بودن ندارد و مقادیر مختلف از انواع داده مختلف نیز میتوانند به مجموعه ارسال شوند.
# Creating a Set with # a List of Numbers # (Having duplicate values) set1 = set([1, 2, 4, 4, 3, 3, 3, 6, 5]) print("\nSet with the use of Numbers: ") print(set1) # Creating a Set with # a mixed type of values # (Having numbers and strings) set1 = set([1, 2, 'datayad', 4, 'For', 6, 'datayad']) print("\nSet with the use of Mixed Values") print(set1)
خروجی:
Set with the use of Numbers: {1, 2, 3, 4, 5, 6} Set with the use of Mixed Values {1, 2, 4, 6, 'For', 'datayad'}
ایجاد یک مجموعه با روشی دیگر
# Another Method to create sets in Python3 # Set containing numbers my_set = {1, 2, 3} print(my_set)
خروجی:
{1, 2, 3}
افزودن عناصر به یک مجموعه
استفاده از متد ()add
عناصر میتوانند با استفاده از تابع داخلی add به مجموعه اضافه شوند. تنها یک عنصر در هر زمان میتواند با استفاده از متد add به مجموعه اضافه شود، اما با استفاده از این متد و از حلقهها، میتوان چندین عنصر را به یکباره به مجموعه اضافه کرد.
توجه: لیستها به عنوان عناصر به یک مجموعه اضافه نمیشوند، زیرا لیستها قابل هش کردن نیستند در حالی که تاپلها به عنوان عناصر مجموعه قابل اضافه شدن هستند؛ چرا که تاپلها تغییرناپذیر هستند و بنابراین قابل هش کردن هستند.
# Python program to demonstrate # Addition of elements in a Set # Creating a Set set1 = set() print("Initial blank Set: ") print(set1) # Adding element and tuple to the Set set1.add(8) set1.add(9) set1.add((6, 7)) print("\nSet after Addition of Three elements: ") print(set1) # Adding elements to the Set # using Iterator for i in range(1, 6): set1.add(i) print("\nSet after Addition of elements from 1-5: ") print(set1)
خروجی:
Initial blank Set:
set()
Set after Addition of Three elements:
{8, 9, (6, 7)}
Set after Addition of elements from 1-5:
{1, 2, 3, (6, 7), 4, 5, 8, 9}
استفاده از متد ()update
برای اضافه کردن دو عنصر یا بیشتر، از متد update استفاده میشود. متد update لیستها، رشتهها، تاپلها، و همچنین مجموعههای دیگر را به عنوان ورودیهای خود قبول میکند. در همه این موارد، جلوگیری از وجود عناصر تکراری صورت میگیرد.
# Python program to demonstrate # Addition of elements in a Set # Addition of elements to the Set # using Update function set1 = set([4, 5, (6, 7)]) set1.update([10, 11]) print("\nSet after Addition of elements using Update: ") print(set1)
خروجی:
Set after Addition of elements using Update: {4, 5, (6, 7), 10, 11}
دسترسی به یک مجموعه
نمی توانیم با ارجاع به یک شاخص (اندیس – index) به عناصر مجموعه دسترسی پیدا کنیم، زیرا مجموعهها نامرتب هستند و عناصر هیچ شاخصی ندارند. اما میتوانیم با استفاده از حلقه for روی عناصر مجموعه دستوراتی را اجرا کنیم، و یا می توانیم با استفاده از کلمه کلیدی in بپرسیم که آیا یک مقدار مشخص در مجموعه وجود دارد یا خیر.
# Python program to demonstrate # Accessing of elements in a set # Creating a set set1 = set(["datayad", "For", "you."]) print("\nInitial set") print(set1) # Accessing element using # for loop print("\nElements of set: ") for i in set1: print(i, end=" ") # Checking the element # using in keyword print("\n") print("Geeks" in set1)
خروجی:
Initial set {'you.', 'For', 'datayad'} Elements of set: you. For datayad False
حذف عناصر از مجموعه
استفاده از متد ()remove یا ()discard:
میتوانید از تابع داخلی ()remove برای حذف عناصر از مجموعه استفاده کنید، اما اگر عنصر در مجموعه وجود نداشته باشد، یک خطا با نوع KeyError ایجاد میشود.
برای حذف عناصر از یک مجموعه بدون ایجاد KeyError، از ()discard استفاده کنید؛ اگر عنصر در مجموعه وجود نداشته باشد، مجموعه بدون تغییر باقی میماند.
# Python program to demonstrate # Deletion of elements in a Set # Creating a Set set1 = set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) print("Initial Set: ") print(set1) # Removing elements from Set # using Remove() method set1.remove(5) set1.remove(6) print("\nSet after Removal of two elements: ") print(set1) # Removing elements from Set # using Discard() method set1.discard(8) set1.discard(9) print("\nSet after Discarding two elements: ") print(set1) # Removing elements from Set # using iterator method for i in range(1, 5): set1.remove(i) print("\nSet after Removing a range of elements: ") print(set1)
خروجی:
Initial Set: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} Set after Removal of two elements: {1, 2, 3, 4, 7, 8, 9, 10, 11, 12} Set after Discarding two elements: {1, 2, 3, 4, 7, 10, 11, 12} Set after Removing a range of elements: {7, 10, 11, 12}
استفاده از متد ()pop
تابع ()pop همچنین میتواند برای حذف و بازگرداندن یک عنصر از مجموعه استفاده شود، اما تنها آخرین عنصر مجموعه را حذف میکند.
توجه: اگر مجموعه نامرتب باشد، هیچ راهی برای تعیین اینکه کدام عنصر با استفاده از تابع ()pop حذف میشود وجود ندارد.
# Python program to demonstrate # Deletion of elements in a Set # Creating a Set set1 = set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) print("Initial Set: ") print(set1) # Removing element from the # Set using the pop() method set1.pop() print("\nSet after popping an element: ") print(set1)
خروجی:
Initial Set: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} Set after popping an element: {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
استفاده از متد ()clear
برای حذف همه عناصر از مجموعه، از تابع ()clear استفاده میشود.
#Creating a set set1 = set([1,2,3,4,5]) print("\n Initial set: ") print(set1) # Removing all the elements from # Set using clear() method set1.clear() print("\nSet after clearing all the elements: ") print(set1)
خروجی:
Initial set: {1, 2, 3, 4, 5} Set after clearing all the elements: set()
مجموعههای یخزده (frozen sets)
در پایتون اشیاء غیرقابل تغییری هستند که تنها از متدها و عملگرهایی پشتیبانی میکنند که نتیجه آنها بدون تغییر مجموعه یخ زده یا مجموعههایی که بر روی آنها اعمال میشوند، تولید میشود.
در حالی که عناصر یک مجموعه میتوانند در هر زمان تغییر داده شوند، عناصر مجموعه یخزده پس از ایجاد، تغییر نمیکنند.
اگر هیچ پارامتری برای این تابع ارسال نشود، یک frozenset خالی برمیگرداند.
# Python program to demonstrate # working of a FrozenSet # Creating a Set String = ('d', 'a', 't', 'a', 'y', 'a', 'd', 'f', 'o', 'r') Fset1 = frozenset(String) print("The FrozenSet is: ") print(Fset1) # To print Empty Frozen Set # No parameter is passed print("\nEmpty FrozenSet: ") print(frozenset())
خروجی:
The FrozenSet is: frozenset({'o', 'a', 'f', 'y', 'r', 't', 'd'}) Empty FrozenSet: frozenset()
تبدیل نوع اشیاء به مجموعهها
# Typecasting Objects in Python3 into sets # Typecasting list into set my_list = [1, 2, 3, 3, 4, 5, 5, 6, 2] my_set = set(my_list) print("my_list as a set: ", my_set) # Typecasting string into set my_str = "datayadforyou" my_set1 = set(my_str) print("my_str as a set: ", my_set1) # Typecasting dictionary into set my_dict = {1: "One", 2: "Two", 3: "Three"} my_set2 = set(my_dict) print("my_dict as a set: ", my_set2)
خروجی:
my_list as a set: {1, 2, 3, 4, 5, 6} my_str as a set: {'f', 'o', 'a', 'r', 'y', 'd', 't', 'u'} my_dict as a set: {1, 2, 3}
مثال: اجرای تمام توابع
def create_set(): my_set = {1, 2, 3, 4, 5} print(my_set) def add_element(): my_set = {1, 2, 3, 4, 5} my_set.add(6) print(my_set) def remove_element(): my_set = {1, 2, 3, 4, 5} my_set.remove(3) print(my_set) def clear_set(): my_set = {1, 2, 3, 4, 5} my_set.clear() print(my_set) def set_union(): set1 = {1, 2, 3} set2 = {4, 5, 6} my_set = set1.union(set2) print(my_set) def set_intersection(): set1 = {1, 2, 3, 4, 5} set2 = {4, 5, 6, 7, 8} my_set = set1.intersection(set2) print(my_set) def set_difference(): set1 = {1, 2, 3, 4, 5} set2 = {4, 5, 6, 7, 8} my_set = set1.difference(set2) print(my_set) def set_symmetric_difference(): set1 = {1, 2, 3, 4, 5} set2 = {4, 5, 6, 7, 8} my_set = set1.symmetric_difference(set2) print(my_set) def set_subset(): set1 = {1, 2, 3, 4, 5} set2 = {2, 3, 4} subset = set2.issubset(set1) print(subset) def set_superset(): set1 = {1, 2, 3, 4, 5} set2 = {2, 3, 4} superset = set1.issuperset(set2) print(superset) if __name__ == '__main__': create_set() add_element() remove_element() clear_set() set_union() set_intersection() set_difference() set_symmetric_difference() set_subset() set_superset()
خروجی:
{1, 2, 3, 4, 5} {1, 2, 3, 4, 5, 6} {1, 2, 4, 5} set() {1, 2, 3, 4, 5, 6} {4, 5} {1, 2, 3} {1, 2, 3, 6, 7, 8} True True
مزایای مجموعه ها در پایتون (Set)
– عناصر منحصر به فرد: مجموعهها تنها میتوانند شامل عناصر منحصر به فرد باشند، بنابراین میتوانند برای حذف تکرارها از یک مجموعه داده مفید باشند.
– تست سریع عضویت: مجموعهها برای تست سریع عضویت بهینهسازی شدهاند، بنابراین میتوانند برای تعیین اینکه آیا یک مقدار در یک مجموعه است یا خیر، مفید باشند.
– عملیات ریاضیاتی مجموعه: مجموعهها عملیات ریاضیاتی مجموعه مانند اتحاد، اشتراک و تفاوت را پشتیبانی میکنند که میتواند برای کار با مجموعههای داده مفید باشد.
– قابل تغییر: مجموعهها قابل تغییر هستند، به این معنا که میتوانید بعد از ایجاد، عناصری را به مجموعه اضافه یا از آن حذف کنید.
معایب مجموعه ها در پایتون (Set)
– نامرتب: مجموعهها نامرتب هستند، به این معنا که نمیتوانید به ترتیب دادهها در مجموعه اعتماد کنید. این ممکن است باعث شود که دسترسی یا پردازش دادهها به ترتیب خاصی دشوار شود.
– کاربردهای محدودتر: مجموعهها نسبت به لیستها کمکاربردتر هستند، زیرا از متدهایی مانند append یا pop پشتیبانی نمیکنند. این میتواند باعث شود که تغییر یا دستکاری دادههای ذخیره شده در یک مجموعه دشوارتر شود.
– مصرف حافظه: مجموعهها ممکن است حافظه بیشتری را نسبت به لیستها مصرف کنند، به ویژه برای مجموعههای داده کوچک. این به این دلیل است که هر عنصر در یک مجموعه به حافظه اضافی نیاز دارد تا یک مقدار هش را ذخیره کند.
– کمکاربردتر: مجموعهها در پایتون کمکاربردتر از لیستها و دیکشنریها هستند، به این معنا که ممکن است منابع یا کتابخانههای کمتری برای کار با آنها موجود باشد. این ممکن است باعث شود که پیدا کردن راهحلها برای مسائل یا گرفتن کمک در اشکالزدایی هنگام کار با آنها دشوارتر شود.
به طور کلی، مجموعه ها در پایتون میتوانند یک ساختار داده مفید در پایتون باشند، به ویژه برای حذف تکرارها یا برای تست سریع عضویت. با این حال عدم مرتب بودن و قابلیتهای محدود آنها، میتواند باعث شود که آنها نسبت به لیستها یا دیکشنریها کمتر تطبیق پذیر باشند.
بنابراین هنگامی که قصد دارید ساختار دادهای خاص را در برنامه پایتون خود استفاده کنید، مهم است که با دقت مزایا و معایب استفاده از مجموعهها را نیز در نظر بگیرید.
متدهای مجموعه
تابع |
توضیحات |
add() |
یک عنصر به مجموعه اضافه میکند |
remove() |
یک عنصر را از مجموعه حذف میکند. اگر عنصر در مجموعه وجود نداشته باشد، یک خطا از نوع KeyError ایجاد میشود |
clear() |
تمام عناصر مجموعه را حذف میکند |
copy() |
یک کپی از مجموعه را برمیگرداند |
pop() |
یک عنصر تصادفی از مجموعه را حذف و برمیگرداند. اگر مجموعه خالی باشد، یک خطا از نوع KeyError ایجاد میشود |
update() |
مجموعه را با اتحاد خود و دیگر مجموعهها بهروز میکند |
union() |
اتحاد مجموعهها را در یک مجموعه جدید برمیگرداند |
difference() |
اختلاف دو یا چند مجموعه را بهعنوان یک مجموعه جدید برمیگرداند |
difference_update() |
تمام عناصر مجموعه دیگر را از این مجموعه حذف میکند |
discard() |
یک عنصر را از مجموعه حذف میکند. (اگر عنصر در مجموعه نباشد، هیچ عملی انجام نمیدهد) |
intersection() |
اشتراک دو مجموعه را بهعنوان یک مجموعه جدید برمیگرداند |
intersection_update() |
مجموعه را با اشتراک خود و یک مجموعه دیگر بهروز میکند |
isdisjoint() |
اگر دو مجموعه اشتراک نداشته باشند، True برمیگرداند |
issubset() |
اگر یک مجموعه، زیرمجموعه دیگری باشد، True برمیگرداند |
issuperset() |
اگر یک مجموعه شامل مجموعه دیگر باشد، True برمیگرداند (برعکس ()issubset) |
symmetric_difference() |
تفاوت همگن دو مجموعه را بهعنوان یک مجموعه جدید برمیگرداند |
symmetric_difference_update() |
مجموعه را با تفاوت همگن خود و یک مجموعه دیگر بهروز میکند |