فصل ۷: تاپلها و مجموعهها در پایتون

در این فصل به دو نوع داده مهم و گاهی کمتر توجهشده در پایتون میپردازیم؛ تاپل (Tuple) که برای نگهداری مجموعهای از دادههای «تغییرناپذیر» است، و مجموعه (Set) که برخلاف لیست، ترتیب ندارد و اعضای آن منحصر بهفرد هستند. در بسیاری از پروژههای برنامهنویسی در سطوح مقدماتی و پیشرفته، دانستن کاربرد و تفاوت این ساختارها ضروری است.
۷.۱ | تاپلها در پایتون (Tuples in Python)
تعریف و معرفی تاپل
تاپلها مانند لیستها برای نگهداری چندین مقدار کنار هم استفاده میشوند، اما تفاوت اصلی تاپل با لیست در “تغییرناپذیر بودن” آنهاست.
زمانیکه یک تاپل ساخته شد، محتوای آن قابل تغییر (افزودن، حذف یا ویرایش) نیست.
نحوه تعریف تاپل:
تاپلها با پرانتز () تعریف میشوند. میتوانید هر تعداد از عناصر را با ویرگول داخل آن قرار دهید.
my_tuple = (1, 2, 3)
fruits_tuple = ("سیب", "موز", "پرتقال")
mixed_tuple = (1, "دو", 3.0, True)
حتی میتوانید تاپلهایی با یک عنصر بسازید، که باید یک ویرگول انتهای آن باشد:
single_item = (42,)
دسترسی به عناصر تاپل
مانند لیست، با ایندکس الفبای تاپلها قابلبرداشت است:
print(fruits_tuple[1]) # موز
print(fruits_tuple[-1]) # پرتقال
توجه: عملیات برش (slicing) هم مانند لیست قابل انجام است:
print(mixed_tuple[:2]) # (1, "دو")
ویژگیهای کلیدی تاپلها:
- تغییرناپذیر بودن: پس از ساختاردهی، قابل ویرایش نیستند.
- قابل گذر (Iterable): مانند لیست میتوان روی عناصر تاپل با حلقه for حرکت کرد.
- قابل استفاده بهعنوان کلید دیکشنری: به دلیل “hashable” بودن، تاپل میتواند نقش کلید را در انواع داده مانند دیکشنری بازی کند (بر خلاف لیست).
- میتوانند انواع داده مختلف داشته باشند: ترکیب انواع داده در تاپل مانعی ندارد.
- سبکتر و سریعتر از لیست هستند.
تفاوت کلیدی بین لیست و تاپل:
| لیست | تاپل | |
|---|---|---|
| قابل تغییر | بله | خیر |
| نحوه تعریف | [] | () |
| استفاده به عنوان کلید دیکشنری | خیر | بله |
اشتباهات رایج در تاپلها
- تلاش برای تغییر/حذف یک عنصر:
t = (1, 2, 3)
# t[0] = 8 # خطا
- فراموش کردن ویرگول در تاپلهای تکعنصر:
t = (5) # این یک عدد است، نه تاپل
t = (5,) # این یک تاپلِ تک عضوی است
مثال کاربردی:
تاپلها مناسب دادههای ثابتاند، مثل مختصات جغرافیایی یا رنگها:
color = (255, 255, 0) # RGB
point = (34.5, 8.2)
۷.۲ | کاربردها و استفادههای عمومی تاپلها
- بازگرداندن چند مقدار از تابع:
گاهی در یک تابع میخواهید دو یا چند مقدار را برگردانید:
def get_dimensions():
return (1920, 1080)
width, height = get_dimensions()
print("عرض:", width, "ارتفاع:", height)
- دادههای ثابت: مثلاً لیست روزهای هفته، ماهها یا حالتهای ثابت
days = ("شنبه", "یکشنبه", "دوشنبه", "سهشنبه", "چهارشنبه", "پنجشنبه", "جمعه")
- استفاده به عنوان کلید در دیکشنری:
locations = {}
locations[(35.7, 51.4)] = "تهران"
نکات حرفهای درباره تاپلها
- تاپلها سریعتر از لیست ساخته و پیمایش میشوند.
- برای مقادیر غیرقابل تغییر، استفاده از تاپل باعث امنیت بیشتر برنامه میشود.
- اگر لازم شد، با دستور
tuple(list)میتوانید لیست را به تاپل تبدیل کنید.
تمرین ۱:
یک تاپل از سه عدد بنویس و با استفاده از ایندکس دوم را چاپ کن.
پاسخ:
numbers = (11, 22, 33)
print(numbers[1]) # خروجی: 22
۷.۳ | مجموعهها (Sets) در پایتون
تعریف مجموعه و تفاوت آن با لیست
مجموعه (Set) ساختاری در پایتون است که:
- عناصر آن “بدون ترتیب” و “بدون تکرار” هستند.
- اعضا با آکولاد (
{}) جدا میشوند.
مثال تعریف مجموعه:
my_set = {1, 2, 3, 4}
fruits_set = {"سیب", "موز", "پرتقال"}
mixed_set = {42, "سلام", 3.14}
توجه: لیست خالی با [] و دیکشنری خالی با {} ساخته میشود؛ اما مجموعه خالی فقط با دستور
set()تعریف میشود:
empty_set = set()
ویژگیهای مجموعهها:
- بدون ترتیب: نمیتوانید روی شماره (ایندکس) عناصر حساب کنید.
- عدم پذیرش عنصر تکراری: هر عضو فقط یکبار ظاهر میشود.
- قابل تغییر: میتوان عضو اضافه یا حذف کرد.
- کارایی بالا در تست وجود عنصر در مجموعه: سریعتر از لیست است، مناسب زمانی که وجود یا عدم وجود یک مقدار مهم باشد.
افزودن و حذف عنصر:
fruits_set.add("گلابی")
print(fruits_set)
fruits_set.remove("موز") # اگر وجود نداشت، خطا میدهد
fruits_set.discard("هلو") # اگر نبود، خطا نمیدهد
بررسی وجود عضو:
if "سیب" in fruits_set:
print("سیب عضو مجموعه است.")
پیمایش مجموعه با حلقه for
for item in fruits_set:
print(item)
خروجی ممکن است هر بار ترتیب متفاوتی داشته باشد!
جمعبندی تفاوت لیست، تاپل و مجموعه
| نوع داده | قابل تغییر | تکراری مجاز | دارای ترتیب | تعریف |
|---|---|---|---|---|
| لیست | بله | بله | بله | [1,2,3] |
| تاپل | خیر | بله | بله | (1,2,3) |
| مجموعه | بله | خیر | خیر | {1,2,3} |
۷.۴ | عملیات ریاضی روی مجموعهها در پایتون (Union, Intersection, Difference, Symmetric Difference)
پایتون مجموعهها را فقط برای نگهداری عناصر منحصر به فرد به کار نمیبرد، بلکه چهار عملیات مهم روی آنها قابل اعمال است که در ریاضیات هم کاربرد دارند. این چهار عملیات، پردازش روی دادههای گزینشی را بسیار ساده و سریع میکنند.
۱. اجتماع (Union)
تمام عناصر موجود در هر دو مجموعه. عنصر مشترک فقط یکبار خواهد بود.
A = {1, 2, 3}
B = {3, 4, 5}
# روش عملگر |
result = A | B
print(result) # {1, 2, 3, 4, 5}
# روش متد
result = A.union(B)
print(result)
۲. تقاطع (Intersection)
عناصر مشترک هر دو مجموعه.
result = A & B
print(result) # {3}
result = A.intersection(B)
print(result)
۳. تفاضل (Difference)
عناصر موجود در مجموعه اول که در دومی نیستند.
result = A - B
print(result) # {1, 2}
result = A.difference(B)
print(result)
۴. تفاضل متقارن (Symmetric Difference)
عناصر موجود در «یکی» از دو مجموعه اما نه هر دو.
result = A ^ B
print(result) # {1, 2, 4, 5}
result = A.symmetric_difference(B)
print(result)
کاربرد عملی:
- یافتن دانشآموزانی که فقط در یکی از دو کلاس حضور دارند
- جمع آوری علایق یکتا از چندین منبع
- حذف موارد تکراری بین دو منبع داده
نکات حرفهای درباره مجموعهها
- برای حذف همه عناصر:
my_set.clear() - برای کپی سطحی مجموعه:
new_set = my_set.copy() - تبدیل لیست به مجموعه (برای حذف عناصر تکراری):
unique_items = set([1,2,2,3,3,3,4])# خروجی: {1,2,3,4}
اشتباهات متداول
- تلاش برای دسترسی به ترتیب اعضا: خطا
my_set[0]غیرمجاز است - مجموعه تو در تو با عناصر غیرقابل hash (مثل لیست): خطا میدهد
مثال:
a = {[1,2], [3,4]} # خطا
- تلاش برای افزودن/حذف عنصری که وجود ندارد:
روشremove()اگر وجود نداشته باشد خطا میدهد، اماdiscard()خطا نمیدهد.
تمرین ۲: تبدیل لیست به مجموعه
برنامهای بنویسید که لیستی از اعداد را از کاربر بگیرد (مثلاً ۵ عدد)، سپس آنها را به مجموعه تبدیل کند و مجموعه نهایی را چاپ کند.
با این کار عددهای تکراری حذف میشوند.
پاسخ پیشنهادی:
nums = []
for i in range(5):
n = int(input("یک عدد وارد کنید: "))
nums.append(n)
unique_nums = set(nums)
print("مجموعه حاصل:", unique_nums)
نتیجه، فقط عددهای منحصربهفرد را نشان میدهد.
۷.۵ | سوالات پرتکرار درباره تاپلها و مجموعهها
۱. چه زمانی باید از تاپل استفاده کنیم و چه زمانی از لیست؟
زمانیکه میدانید دادهها ثابت خواهند ماند و نباید تغییرکنند (مانند مختصات، تنظیمات ثابت و …)، تاپل مناسبتر است و از تغییرات تصادفی جلوگیری میکند. اما اگر نیاز به تغییر در طول برنامه دارید، لیست انتخاب بهتری است.
۲. چگونه میتوان تاپل را به لیست و برعکس تبدیل کرد؟
با توابع list() و tuple() این کار انجام میشود:
tup = (1,2,3)
lst = list(tup)
back_to_tuple = tuple(lst)
۳. چرا مجموعهها ترتیب ندارند؟
ساختار دادهای داخلی مجموعهها بر پایه «هش» است (hashing). این باعث افزایش سرعت و عدم تکرار میشود اما ترتیب عناصر را نامشخص میکند.
۴. میتوانم یک رشته یا لیست را به مجموعه تبدیل کنم؟
بله. مثال:
letters = set("abbcdef")
print(letters) # {'a', 'b', 'c', 'd', 'e', 'f'}
nums = set([1,3,3,5])
print(nums) # {1, 3, 5}
۷.۶ | تمرین چالشی: مجموعه یکتا
یک برنامه بنویسید که از کاربر بینهایت عدد دریافت کند (تا وقتی ورودی خالی داده شود)، تمام اعداد را به لیست اضافه کند، لیست را به مجموعه تبدیل، و هر عدد یکتا را چاپ نماید.
نمونه پاسخ:
numbers = []
while True:
n = input("عدد وارد کنید (برای پایان Enter): ")
if n == "":
break
numbers.append(int(n))
unique_numbers = set(numbers)
print("اعداد یکتا:", unique_numbers)
جمعبندی
در این فصل با دو نوع داده «تاپل» و «مجموعه» در پایتون آشنا شدیم؛
تاپل برای دادههای ثابت و بدون تغییر، و مجموعه برای دادههای بدون تکرار و بدون ترتیب. فراگیری شباهتها و تفاوتها و شناخت کاربرد هرکدام، ابزار لازم برای نوشتن کدهای کارا، امن و سریع را در اختیارتان میگذارد.