Kahibaro
Discord Login Register

انتخاب ساختار دادهٔ مناسب

مقایسه و انتخاب ساختار داده

در فصل «مجموعه‌های داده» با چهار ساختار اصلی آشنا شدید:

در این بخش، تمرکز ما روی این است که در هر مسئله کدام‌یک را انتخاب کنیم و چرا؛ نه روی نحو (syntax) و جزئیات که قبلاً دیده‌اید.


چند سؤال کلیدی برای انتخاب ساختار داده

پیش از انتخاب ساختار، این سؤال‌ها را از خود بپرسید:

  1. آیا ترتیب (order) عناصر برای من مهم است؟
    • بله → معمولاً list یا tuple
    • نه → می‌توان set یا dict را هم در نظر گرفت
  2. آیا داده‌ها قرار است بعداً تغییر کنند؟ (افزودن، حذف، ویرایش)
    • بله → ساختار قابل‌تغییر (mutable) مثل list, dict, set
    • نه → ساختار ثابت مثل tuple (برای امنیت و جلوگیری از تغییر ناخواسته)
  3. چگونه قرار است به داده‌ها دسترسی پیدا کنم؟
    • با شمارهٔ موقعیت (۰، ۱، ۲، …) → list یا tuple
    • با یک کلید معنادار (مثل name, age, id) → dict
    • بیشتر می‌خواهم بدانم «آیا این عضو هست یا نه؟» → set (و تا حدی dict)
  4. آیا عناصر می‌توانند تکراری باشند؟
    • بله → list, tuple, dict (کلیدها تکراری نیستند، ولی مقدارها می‌توانند باشند)
    • نه → set (به‌صورت خودکار تکراری‌ها را حذف می‌کند)

با همین چهار سؤال، در اکثر موقعیت‌های ساده می‌توانید ساختار مناسب را انتخاب کنید.


لیست (`list`) را چه زمانی انتخاب کنیم؟

ویژگی مهم: قابل‌تغییر، مرتب، پشتیبانی از عناصر تکراری، دسترسی با اندیس.

لیست معمولاً اولین انتخاب برای داده‌های «چندتایی» است؛ مثل:

مناسب است وقتی:

مثال‌های رایج استفاده از لیست:

تاپل (`tuple`) را چه زمانی انتخاب کنیم؟

ویژگی مهم: مرتب، اما غیرقابل‌تغییر (immutable).

تاپل را زمانی استفاده کنید که:

نمونهٔ متعارف:

person = ("Ali", 25, "Tehran")

در این‌جا person یک «رکورد» است؛ نام، سن و شهر با هم معنی پیدا می‌کنند و قرار نیست مدام عناصر این رکورد را حذف/اضافه کنیم.

چرا تاپل وقتی داده تغییر نمی‌کند بهتر است؟

دیکشنری (`dict`) را چه زمانی انتخاب کنیم؟

ویژگی مهم: نگه داشتن داده به‌صورت کلید → مقدار.

دیکشنری مناسب است وقتی:

student = {
    "name": "Sara",
    "age": 20,
    "city": "Mashhad"
}

این‌جا:

بهتر است دیکشنری را انتخاب کنید اگر:

مثال کاربردی:

config = {
    "theme": "dark",
    "language": "fa",
    "autosave": True
}
inventory = {
    "apple": 20,
    "banana": 35,
    "orange": 12
}

مجموعه (`set`) را چه زمانی انتخاب کنیم؟

ویژگی مهم:
بدون ترتیب مشخص، بدون تکرار، مناسب برای کار با «عضویت» و «اشتراک/اتحاد».

اگر مسئلهٔ شما بیشتر شبیه این سؤال‌هاست:

آن‌وقت set انتخاب خوبی است.

مثال‌ها:

  1. لیست ایمیل‌های واردشده توسط کاربر، اما هر ایمیل فقط یک‌بار:
emails = ["a@test.com", "b@test.com", "a@test.com"]
unique_emails = set(emails)   # تکراری‌ها حذف می‌شوند
  1. پیدا کردن کتاب‌های مشترک دو نفر:
ali_books = {"Python", "C++", "Linux"}
sara_books = {"Python", "HTML", "CSS"}
common = ali_books & sara_books  # اشتراک

set را انتخاب کنید اگر:

جدول مقایسهٔ سریع


ویژگی / نوع دادهlisttupledictset
ترتیب حفظ می‌شود؟بلهبله(نسخه‌های جدید: بله)نه (برای ما مهم نیست)
قابل‌تغییر است؟بلهنهبلهبله
اجازهٔ تکرار دارد؟بلهبلهکلید: نه، مقدار: بلهنه
دسترسی اصلیاندیس (۰،۱،۲,…)اندیسکلید ("name", "age")بررسی عضویت (in)
کاربرد معمولفهرست، صف، تاریخچهرکورد ثابت، مختصاتمشخصات، تنظیمات، نگاشت‌هامجموعهٔ یکتا، عملیات ریاضی مجموعه‌ها

الگوهای رایج تصمیم‌گیری

۱. فهرست اشیاء در مقابل دیکشنریِ اشیاء

فرض کنید یک سیستم برای مدیریت کتابخانه می‌نویسید.

books = ["Book A", "Book B", "Book C"]   # لیست ساده
book1 = {
    "title": "Book A",
    "author": "Author A",
    "year": 2020
}
books = [
    {"title": "Book A", "author": "Author A", "year": 2020},
    {"title": "Book B", "author": "Author B", "year": 2018},
]

پس:

۲. انتخاب بین list و set در مسئلهٔ عضویت

سناریو: می‌خواهید چک کنید آیا یک کاربر عضو لیست کاربران مسدودشده هست یا نه.

blocked_users = {"ali", "sara", "mina"}  # set
if username in blocked_users:
    print("دسترسی مسدود است.")

۳. استفاده از tuple به‌جای list برای دادهٔ ثابت

اگر مختصات چند نقطه را ذخیره می‌کنید، و نمی‌خواهید نقاط تغییر کنند:

point = (10, 20)   # بهتر از [10, 20] اگر قرار نیست تغییر کند

در عوض، برای لیست مسیر حرکت (که تغییر می‌کند و عناصر جدید اضافه می‌شوند):

path = []          # شروع خالی
path.append((0, 0))
path.append((1, 2))

اینجا:

چند سناریوی تمرینی ذهنی

در هر سناریو، سعی کنید قبل از دیدن پاسخ، حدس بزنید از چه ساختاری استفاده می‌کنید.

سناریو ۱: فهرست کارهای روزانه

انتخاب: list
مثال:

tasks = ["خرید نان", "مطالعهٔ پایتون", "ورزش"]

سناریو ۲: اطلاعات دانش‌آموز

انتخاب: dict برای هر دانش‌آموز.
اگر چند دانش‌آموز دارید، می‌توانید:

سناریو ۳: مجموعهٔ یکتای برچسب‌ها (Tags)

انتخاب: set برای برچسب‌های هر نوشته.

tags = {"python", "beginner", "code"}

سناریو ۴: روزهای هفته

انتخاب: tuple (یا حتی list، اما tuple معنای «ثابت»بودن را بهتر منتقل می‌کند):

week_days = ("شنبه", "یکشنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنجشنبه", "جمعه")

راهنمای کوتاه «اگر … پس …»

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

Views: 6

Comments

Please login to add a comment.

Don't have an account? Register now!