Homeداده کاویتفاوت تاپل، مجموعه و دیکشنری در Python؛ آموزش با مثال

تفاوت تاپل، مجموعه و دیکشنری در Python؛ آموزش با مثال

در Python، انتخاب ساختار داده روی نحوهٔ نگهداری، پیدا کردن و تغییر اطلاعات اثر می‌گذارد. تاپل (tuple) برای داده‌های مرتب و تغییرناپذیر، مجموعه (set) برای نگهداری اعضای یکتا و دیکشنری (dict) برای ارتباط‌دادن کلیدها به مقدارها مناسب است. این راهنما تفاوت آن‌ها را با مثال‌های قابل اجرا و یک سناریوی ثبت‌نام دوره توضیح می‌دهد.

پاسخ کوتاه: تفاوت tuple، set و dict چیست؟

  • tuple: دنباله‌ای مرتب که اعضایش را نمی‌توان با انتساب جایگزین کرد؛ دسترسی با اندیس دارد.
  • set: مجموعه‌ای از اعضای یکتا و قابل هش؛ ترتیب یا جایگاه اعضا برای آن تعریف نشده و اندیس‌گذاری ندارد.
  • dict: نگاشت کلیدهای یکتا به مقدارها؛ برای بازیابی یک مقدار با کلید مناسب است و در نسخه‌های جدید Python ترتیب درج کلیدها را حفظ می‌کند.

قاعدهٔ ساده: برای «موقعیت و ترتیب ثابت» tuple، برای «یکتا بودن» set و برای «نام یا شناسه ← مقدار» dict را انتخاب کنید.

تاپل در Python: دادهٔ مرتب و تغییرناپذیر

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

location = (35.6892, 51.3890)
latitude = location[0]
longitude = location[1]

# تاپل تک‌عضوی به ویرگول نیاز دارد
one_value = (5,)

این کد مختصات تهران را در یک تاپل نگه می‌دارد. عبارت location[0] = 36 خطای TypeError می‌دهد، چون نمی‌توان عضو تاپل را با انتساب عوض کرد. با این حال، اگر یک تاپل شیء تغییرپذیری مثل فهرست داشته باشد، خود فهرست می‌تواند تغییر کند؛ پس «تغییرناپذیر» به معنی ثابت‌ماندن تمام اشیای داخل آن نیست.

تاپل‌ها را می‌توان بازگشایی (unpack) کرد: latitude, longitude = location. همچنین یک تاپل فقط وقتی کلید دیکشنری یا عضو set می‌شود که اجزایش قابل هش باشند؛ مثلاً تاپلِ شامل list برای این کار مناسب نیست.

مجموعه در Python: حذف تکرار و بررسی عضویت

set اعضای تکراری را یکی می‌کند و برای بررسی عضویت یا انجام عملیات مجموعه‌ای مثل اشتراک و اجتماع کاربرد دارد. اعضا باید قابل هش باشند؛ بنابراین list و dict را نمی‌توان مستقیماً داخل set قرار داد.

visited_cities = {"تهران", "شیراز", "تهران"}
print(visited_cities)  # فقط یک "تهران" وجود دارد

required = {"Python", "Excel"}
completed = {"Python", "SQL"}
print(required & completed)  # {'Python'}
print("Excel" in completed)  # False

empty_set = set()  # {} یک دیکشنری خالی می‌سازد

set ترتیب درج یا شمارهٔ اندیس را نگه نمی‌دارد؛ به خروجی آن به‌عنوان فهرستی با ترتیب ثابت تکیه نکنید. اگر ترتیب مهم است، از list یا tuple استفاده کنید. اگر هم‌زمان یکتایی و ترتیب درج را لازم دارید، معمولاً می‌توان ابتدا داده‌ها را با dict.fromkeys(items) یکتا کرد و سپس از کلیدها استفاده کرد.

دیکشنری در Python: نگاشت کلید به مقدار

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

course = {
    "title": "Python مقدماتی",
    "capacity": 24,
    "active": True
}

print(course["title"])
print(course.get("price", 0))  # کلید وجود ندارد: مقدار پیش‌فرض 0
course["capacity"] = 30        # مقدار یک کلید موجود را عوض می‌کند
course["level"] = "مقدماتی"    # یک کلید تازه اضافه می‌کند

خواندن course["price"] وقتی کلید وجود ندارد، KeyError ایجاد می‌کند. از get() زمانی استفاده کنید که نبودن کلید پذیرفتنی است و مقدار جایگزین می‌خواهید. برای تشخیص صریح می‌توانید بنویسید "price" in course.

سناریوی واقعی: ثبت‌نام دانشجویان در یک دوره

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

registrations = [
    (104, "Sara", "Python"),
    (105, "Amir", "Python"),
    (104, "Sara", "Python")
]

# tuple: هر رکورد با ترتیب ثابت (شناسه، نام، دوره)
student_ids = {record[0] for record in registrations}
print(student_ids)  # {104, 105}؛ ترتیب چاپ تضمین‌شده نیست

# dict: بازیابی جزئیات با شناسهٔ دانشجو
students = {
    record[0]: {"name": record[1], "course": record[2]}
    for record in registrations
}
print(students[104]["name"])  # Sara

# tuple به عنوان کلید مرکب؛ اجزای آن قابل هش هستند
enrollment_counts = {}
for student_id, name, course_name in registrations:
    key = (student_id, course_name)
    enrollment_counts[key] = enrollment_counts.get(key, 0) + 1

print(enrollment_counts[(104, "Python")])  # 2

در این مثال، tuple قالب ثابت هر رکورد است، set شناسه‌های تکراری را حذف می‌کند و dict جزئیات یا شمارش را با کلید بازیابی می‌کند. دیکشنری students در دادهٔ نمونه، مقدار شناسهٔ 104 را در ثبت دوم دوباره می‌نویسد؛ چون اطلاعات یکسان‌اند نتیجه تفاوتی ندارد. اگر چند ثبت‌نام از یک دانشجو ممکن است جزئیات متفاوت داشته باشند، بهتر است به‌جای نگاشت یک‌به‌یک، فهرستی از ثبت‌نام‌ها برای هر شناسه نگه دارید تا دادهٔ قبلی ناخواسته جایگزین نشود.

مقایسهٔ سریع tuple، set و dict

ویژگیtuplesetdict
ساختاردنبالهٔ مقادیراعضای یکتاکلید و مقدار
ترتیبحفظ می‌شودترتیب/اندیس نداردترتیب درج حفظ می‌شود (Python 3.7+)
تغییرپذیریغیرقابل انتساب مجدد به اعضاقابل تغییر؛ برای نسخهٔ ثابت frozensetقابل تغییر
دسترسی معمولاندیس، مانند t[0]عضویت، مانند x in sکلید، مانند d[key]
کاربرد نمونهمختصات یا رکورد ثابتیافتن یکتاها و اشتراکپروفایل، تنظیمات یا شمارش

چطور بین این سه ساختار انتخاب کنیم؟

  • اگر ترتیب مهم است و می‌خواهید مقادیر را با اندیس بخوانید، tuple (یا اگر نیاز به تغییر دارید list) را به کار ببرید.
  • اگر هدف حذف تکرار، آزمون عضویت یا مقایسهٔ گروه‌هاست، set انتخاب مناسبی است.
  • اگر هر مقدار با شناسه، نام فیلد یا کلید دیگری پیدا می‌شود، dict را انتخاب کنید.
  • اگر به مجموعهٔ یکتا و ثابت نیاز دارید، frozenset را بررسی کنید.

برای کار با جدول‌های چندردیفی و تحلیل داده، ساختارهای داخلی Python ممکن است کافی نباشند؛ کتابخانه‌هایی مانند pandas DataFrame ستون‌های نام‌دار، فیلتر و عملیات جدولی فراهم می‌کنند. برای تمرین مطالب مرتبط، مقالات Python در آکادمی تک را ببینید.

پرسش‌های متداول

آیا tuple کاملاً تغییرناپذیر است؟

خود tuple از انتساب مجدد، حذف یا افزودن عضو پشتیبانی نمی‌کند؛ اما شیء تغییرپذیری که درون آن قرار گرفته، مانند list، ممکن است تغییر کند.

چرا {} مجموعهٔ خالی نیست؟

در Python، {} دیکشنری خالی است. برای مجموعهٔ خالی از set() استفاده کنید.

آیا set ترتیب اعضا را حفظ می‌کند؟

خیر؛ set قرارداد ترتیب یا اندیس ندارد. اگر ترتیب برای برنامه مهم است، از list یا tuple استفاده کنید.

تفاوت دسترسی با کروشه و get() در dict چیست؟

d[key] در نبودن کلید KeyError می‌دهد؛ d.get(key, default) مقدار پیش‌فرض را برمی‌گرداند.

آیا tuple را می‌توان کلید dict کرد؟

اگر تمام اجزای tuple قابل هش باشند، بله. برای نمونه (104, "Python") می‌تواند کلید باشد؛ tuple شامل list نمی‌تواند.

جمع‌بندی

tuple برای دنبالهٔ مرتب با اعضای غیرقابل‌تغییر از راه انتساب، set برای اعضای یکتا و آزمون عضویت، و dict برای نگاشت کلید به مقدار است. در مثال ثبت‌نام، ترکیب هر سه ساختار نشان داد که لازم نیست یکی را جایگزین دیگری کنیم؛ هرکدام مسئلهٔ متفاوتی را حل می‌کند. جزئیات بیشتر را در مستندات رسمی Python دربارهٔ ساختارهای داده و نوع‌های داخلی set بخوانید.

Share: 

No comments yet! You be the first to comment.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *