دیکشنری در پایتون چیست؟ آموزش همراه با مثال

برنامه نویسی

🎯 دیکشنری در پایتون: کلید گنجینه های داده ای شما

دیکشنری در آموزش پایتون با مدرک  یکی از قدرتمندترین و پرکاربردترین ساختارهای داده است که به شما امکان می دهد اطلاعات را به صورت جفت های کلید-مقدار سازماندهی کنید. در این مقاله جامع، از تعریف پایه تا پیشرفته ترین کاربردهای دیکشنری را همراه با مثال های عملی خواهید آموخت.

🎯 پاسخ سریع

دیکشنری در پایتون یک ساختار داده غیرترتیبی و قابل تغییر است که داده ها را به صورت جفت های «کلید:مقدار» (Key-Value) ذخیره می کند. این ساختار برای بازیابی سریع اطلاعات بر اساس کلیدها بهینه سازی شده است.

در دنیای برنامه نویسی پایتون، مدیریت کارآمد داده ها سنگ بنای هر پروژه موفق است. از ذخیره اطلاعات کاربران گرفته تا تنظیمات پیچیده یک برنامه، نیاز به ساختاری داریم که هم انعطاف پذیر باشد و هم دسترسی سریع به داده ها را فراهم کند. اینجا است که دیکشنری ها (Dictionaries) به میدان می آیند. دیکشنری ها، همانند یک فرهنگ لغت واقعی، به شما اجازه می دهند تا اطلاعات را با استفاده از یک کلید منحصر به فرد به مقدار متناظر آن نگاشت کنید. این ویژگی، دیکشنری ها را به یکی از پرکاربردترین و قدرتمندترین ساختارهای داده در پایتون تبدیل کرده است. در این مقاله جامع، ما به تفصیل به بررسی دیکشنری ها در پایتون خواهیم پرداخت: از تعریف پایه و روش های ساخت گرفته تا متدهای پیشرفته، دیکشنری های تو در تو و بهترین شیوه های استفاده از آن ها. با ما همراه باشید تا کلید گنجینه های داده ای پایتون را در دست بگیرید.

📘 دیکشنری در پایتون چیست؟ (درک مفهوم)

دیکشنری در پایتون یک ساختار داده بنیادی و بسیار کارآمد است که اجازه می دهد اطلاعات را به صورت جفت های کلید-مقدار (Key-Value Pairs) ذخیره کنید. برخلاف لیست ها که از ایندکس های عددی برای دسترسی به عناصر استفاده می کنند، دیکشنری ها به شما این امکان را می دهند که با استفاده از کلیدهای توصیفی و منحصر به فرد، به مقادیر مربوطه دسترسی پیدا کنید. این ساختار داده قابل تغییر (Mutable) و غیرترتیبی (Unordered) است، به این معنی که می توانید پس از ایجاد آن، آیتم ها را اضافه، حذف یا ویرایش کنید، اما ترتیب عناصر تضمین شده نیست.

📌 نکات کلیدی

• دیکشنری ها داده ها را به صورت جفت های کلید:مقدار ذخیره می کنند   • کلیدها باید منحصر به فرد و غیر قابل تغییر باشند   • مقادیر می توانند از هر نوع داده ای باشند   • دسترسی به داده ها از طریق کلیدها انجام می شود.

شباهت دیکشنری به دفترچه تلفن (مثال ملموس)

برای درک بهتر دیکشنری، یک دفترچه تلفن را تصور کنید. در این دفترچه، هر نام (مثلاً علی احمدی) یک کلید منحصر به فرد است و شماره تلفن مربوط به آن نام (مثلاً 09123456789) مقدار آن کلید است. وقتی می خواهید شماره تلفن علی احمدی را پیدا کنید، مستقیماً به نام او مراجعه می کنید، نه اینکه تمام دفترچه را خط به خط جستجو کنید. دیکشنری در پایتون دقیقاً به همین شیوه کار می کند: شما یک کلید را ارائه می دهید و دیکشنری مقدار مربوط به آن کلید را بلافاصله به شما برمی گرداند. این ویژگی، دسترسی به داده ها را فوق العاده سریع می کند.

تفاوت دیکشنری با لیست و تاپل

پایتون ساختارهای داده دیگری مانند لیست (List) و تاپل (Tuple) نیز دارد. تفاوت اصلی دیکشنری با این دو در نحوه سازماندهی و دسترسی به داده ها است:

✅ مزایا

دسترسی سریع به مقادیر با استفاده از کلیدهای توصیفی. انعطاف پذیری بالا در اضافه، حذف و ویرایش آیتم ها. مناسب برای ذخیره داده های نامرتب و با روابط کلید-مقدار.

⚠️ محدودیت ها

ترتیب آیتم ها تضمین شده نیست (قبل از پایتون 3.7). کلیدها باید غیر قابل تغییر و منحصر به فرد باشند. مصرف حافظه می تواند کمی بیشتر از لیست ها باشد.

لیست ها و تاپل ها داده ها را به صورت ترتیبی ذخیره می کنند و برای دسترسی به عناصر از ایندکس های عددی (0، 1، 2 و غیره) استفاده می شود. در حالی که لیست ها قابل تغییر هستند، تاپل ها غیرقابل تغییرند. دیکشنری با ارائه یک سیستم نگاشت کلید-مقدار، امکان دسترسی معنایی تر و کارآمدتر به داده ها را فراهم می کند، به ویژه زمانی که ترتیب اهمیت ندارد و نیاز به جستجوی سریع بر اساس یک شناسه خاص دارید.

برنامه نویسی

📘 روش های ساخت دیکشنری در پایتون

ساخت دیکشنری در پایتون به چندین روش مختلف امکان پذیر است که هر کدام کاربرد خاص خود را دارند. انتخاب روش مناسب بستگی به نوع داده ها و سناریوی برنامه نویسی شما دارد.

1️⃣

آکولاد {}ساده ترین روش

2️⃣

تابع dict()از تاپل/لیست

3️⃣

dict() و zip()از دو لیست

4️⃣

Dictionary Comprehensionروش پیشرفته

استفاده از آکولاد {} و روش مستقیم

ساده ترین و رایج ترین روش برای ساخت یک دیکشنری، استفاده از علامت آکولاد ({}) است. در این روش، هر جفت کلید-مقدار با یک دو نقطه (:) از هم جدا شده و جفت ها نیز با کاما (,) از یکدیگر تفکیک می شوند.


my_dict = {نام: سارا, سن: 30, شهر: تهران}
print(my_dict) # خروجی: {'نام': 'سارا', 'سن': 30, 'شهر': 'تهران'}

استفاده از تابع dict() و zip()

تابع dict() به شما این امکان را می دهد که دیکشنری را از یک سری جفت های کلید-مقدار (مانند لیستی از تاپل ها) ایجاد کنید. همچنین می توانید از تابع zip() برای ترکیب دو لیست (یکی برای کلیدها و دیگری برای مقادیر) و سپس تبدیل آن به دیکشنری استفاده کنید.


# ساخت دیکشنری از لیست تاپل ها
items = [(نام, علی), (سن, 25)]
dict_from_tuples = dict(items)
print(dict_from_tuples) # خروجی: {'نام': 'علی', 'سن': 25}

# ساخت دیکشنری از دو لیست با zip()
keys = [محصول, قیمت, موجودی]
values = [لپ تاپ, 12000000, 50]
dict_from_lists = dict(zip(keys, values))
print(dict_from_lists) # خروجی: {'محصول': 'لپ تاپ', 'قیمت': 12000000, 'موجودی': 50}

درک مفهوم Dictionary Comprehension

Dictionary Comprehension یک روش مختصر و کارآمد برای ایجاد دیکشنری ها بر اساس یک عبارت و یک حلقه تکرار است. این روش به خصوص برای ایجاد دیکشنری های پویا یا تبدیل ساختارهای داده دیگر به دیکشنری مفید است.


# ایجاد دیکشنری از اعداد و مربع آن ها
squares = {x: xx for x in range(1, 6)}
print(squares) # خروجی: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

📘 نحوه دسترسی و مدیریت داده ها

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

دسترسی مستقیم و استفاده از متد get()

برای دسترسی به مقدار یک کلید خاص در دیکشنری، می توانید از دو روش اصلی استفاده کنید: دسترسی مستقیم با استفاده از براکت ([]) و استفاده از متد get().


person = {نام: مریم, سن: 28, شهر: اصفهان}

# دسترسی مستقیم
print(person[نام]) # خروجی: مریم

# استفاده از متد get()
print(person.get(سن)) # خروجی: 28
print(person.get(شغل, نامشخص)) # خروجی: نامشخص (اگر شغل وجود نداشته باشد)

⚠️ هشدار

اگر با استفاده از براکت به کلیدی دسترسی پیدا کنید که در دیکشنری وجود ندارد، پایتون خطای KeyError را صادر می کند. متد get() در این حالت به جای خطا، None را برمی گرداند یا مقدار پیش فرضی که شما تعیین کرده اید.

اضافه کردن یا ویرایش مقادیر

دیکشنری ها قابل تغییر هستند، بنابراین می توانید به راحتی آیتم های جدید به آن ها اضافه کنید یا مقادیر کلیدهای موجود را ویرایش کنید. این کار با استفاده از همان براکت ها ([]) انجام می شود.


student = {نام: رضا, رشته: کامپیوتر}

# اضافه کردن آیتم جدید
student[شهر] = شیراز
print(student) # خروجی: {'نام': 'رضا', 'رشته': 'کامپیوتر', 'شهر': 'شیراز'}

# ویرایش مقدار یک کلید موجود
student[رشته] = برق
print(student) # خروجی: {'نام': 'رضا', 'رشته': 'برق', 'شهر': 'شیراز'}

📘 متدهای پرکاربرد و حیاتی در دیکشنری

دیکشنری ها دارای مجموعه ای از متدهای داخلی هستند که عملیات مختلفی را برای مدیریت و کار با داده ها فراهم می کنند. آشنایی با این متدها برای هر برنامه نویسی ضروری است.

📋 موارد مهم

  • keys(): برگرداندن یک آبجکت شامل تمام کلیدهای دیکشنری.
  • values(): برگرداندن یک آبجکت شامل تمام مقادیر دیکشنری.
  • items(): برگرداندن یک آبجکت شامل جفت های (کلید، مقدار) دیکشنری.
  • pop(key, default): حذف آیتم با کلید مشخص و برگرداندن مقدار آن.
  • popitem(): حذف و برگرداندن آخرین جفت کلید-مقدار اضافه شده.
  • clear(): حذف تمام آیتم ها از دیکشنری.
  • update(other_dict): اضافه کردن آیتم های یک دیکشنری دیگر به دیکشنری فعلی.
  • copy(): ایجاد یک کپی سطحی از دیکشنری.
  • setdefault(key, default_value): اگر کلید وجود داشته باشد، مقدار آن را برمی گرداند؛ در غیر این صورت، کلید را با مقدار پیش فرض اضافه کرده و آن مقدار را برمی گرداند.

بررسی متدهای keys(), values() و items()

این متدها برای دسترسی به اجزای مختلف یک دیکشنری کاربرد دارند و اغلب در حلقه ها برای پیمایش داده ها استفاده می شوند.


data = {A: 10, B: 20, C: 30}

print(data.keys())   # خروجی: dict_keys(['A', 'B', 'C'])
print(data.values()) # خروجی: dict_values([10, 20, 30])
print(data.items())  # خروجی: dict_items([('A', 10), ('B', 20), ('C', 30)])

for key in data.keys():
    print(fکلید: {key})

for value in data.values():
    print(fمقدار: {value})

for key, value in data.items():
    print(fکلید: {key}, مقدار: {value})

متدهای حذف (pop, popitem, clear)

برای حذف آیتم ها از دیکشنری، می توانید از متدهای pop()، popitem() یا clear() استفاده کنید.


sample_dict = {a: 1, b: 2, c: 3}

# pop()
removed_value = sample_dict.pop(b)
print(fمقدار حذف شده: {removed_value}, دیکشنری: {sample_dict}) # خروجی: مقدار حذف شده: 2, دیکشنری: {'a': 1, 'c': 3}

# popitem() (در پایتون 3.7+ آخرین آیتم اضافه شده را حذف می کند)
removed_item = sample_dict.popitem()
print(fآیتم حذف شده: {removed_item}, دیکشنری: {sample_dict}) # خروجی: آیتم حذف شده: ('c', 3), دیکشنری: {'a': 1}

# clear()
sample_dict.clear()
print(fدیکشنری بعد از clear: {sample_dict}) # خروجی: دیکشنری بعد از clear: {}

متد update() برای ترکیب دیکشنری ها

متد update() به شما اجازه می دهد که آیتم های یک دیکشنری را با آیتم های دیکشنری دیگر ترکیب کنید. اگر کلیدی در هر دو دیکشنری وجود داشته باشد، مقدار آن در دیکشنری اصلی به روزرسانی می شود.


dict1 = {نام: حسین, سن: 40}
dict2 = {سن: 41, شغل: مهندس}

dict1.update(dict2)
print(dict1) # خروجی: {'نام': 'حسین', 'سن': 41, 'شغل': 'مهندس'}

📘 دیکشنری های تو در تو (Nested Dictionaries)

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

📊 ساختار دیکشنری تو در تو

users = {
    user1: {
        نام: فرهاد,
        سن: 35,
        اطلاعات تماس: {
            ایمیل: farhad@example.com,
            تلفن: 09121112233
        }
    },
    user2: {
        نام: لیلا,
        سن: 29,
        اطلاعات تماس: {
            ایمیل: leila@example.com,
            تلفن: 09354445566
        }
    }
}
    

نحوه پیمایش و دسترسی به داده های پیچیده

برای دسترسی به داده ها در دیکشنری های تو در تو، باید به صورت سلسله مراتبی از کلیدها استفاده کنید. هر کلید شما را به سطح بعدی دیکشنری هدایت می کند.


# دسترسی به ایمیل کاربر اول
email_user1 = users[user1][اطلاعات تماس][ایمیل]
print(fایمیل کاربر 1: {email_user1}) # خروجی: ایمیل کاربر 1: farhad@example.com

# اضافه کردن یک ویژگی جدید
users[user1][وضعیت] = فعال
print(users[user1]) # خروجی: {'نام': 'فرهاد', 'سن': 35, 'اطلاعات تماس': {'ایمیل': 'farhad@example.com', 'تلفن': '09121112233'}, 'وضعیت': 'فعال'}

📘 نکات کلیدی و بهینه سازی (Performance)

درک عمیق از عملکرد دیکشنری ها و محدودیت های آن ها به شما کمک می کند تا کدی بهینه تر و بدون خطا بنویسید.

برنامه نویسی

چرا دیکشنری ها در جستجو سریع هستند؟ (مرتبه زمانی O(1))

دیکشنری ها در پایتون با استفاده از ساختار داده ای به نام جدول هش (Hash Table) پیاده سازی شده اند. این ساختار باعث می شود که عملیات جستجو، اضافه کردن و حذف (در حالت میانگین) در زمان ثابت (O(1)) انجام شوند. این بدان معناست که صرف نظر از تعداد آیتم ها در دیکشنری، زمان لازم برای انجام این عملیات تقریباً ثابت باقی می ماند که یک مزیت بزرگ در برنامه هایی با حجم داده بالا محسوب می شود.

جستجوO(1) افزودنO(1) حذفO(1) پیمایشO(n)

محدودیت های کلیدها (چرا کلیدها باید Immutable باشند؟)

یک قانون اساسی در دیکشنری های پایتون این است که کلیدها باید غیر قابل تغییر (Immutable) باشند. این بدان معناست که نمی توانید از لیست ها یا دیکشنری های دیگر به عنوان کلید استفاده کنید، زیرا این ساختارها قابل تغییر هستند. دلیل این محدودیت به نحوه کارکرد جدول هش برمی گردد. برای محاسبه هش یک کلید و یافتن جایگاه آن در حافظه، کلید باید در طول عمر خود ثابت بماند. اعداد، رشته ها و تاپل ها (به شرطی که عناصر داخلی آن ها نیز غیر قابل تغییر باشند) نمونه هایی از انواع داده های Immutable هستند که می توانند به عنوان کلید در دیکشنری استفاده شوند.

💡 بینش

درک مفهوم Immutable بودن کلیدها برای جلوگیری از خطاهای رایج و نوشتن کدهای پایدار در پایتون حیاتی است. این قانون تضمین می کند که آدرس حافظه کلید پس از ایجاد آن تغییر نمی کند و دیکشنری می تواند به درستی مقادیر را بازیابی کند.

❓ تفاوت اصلی بین دیکشنری و مجموعه (Set) در پایتون چیست؟

دیکشنری داده ها را به صورت جفت های کلید-مقدار ذخیره می کند، در حالی که مجموعه (Set) فقط مقادیر منحصر به فرد را بدون هیچ ترتیبی نگهداری می کند. مجموعه برای بررسی وجود یک عنصر یا حذف تکرارها کاربرد دارد.

❓ اگر کلیدی را در دیکشنری صدا بزنیم که وجود ندارد، چه اتفاقی می افتد؟

اگر با استفاده از براکت ([]) به کلیدی که وجود ندارد دسترسی پیدا کنید، پایتون خطای KeyError را صادر می کند. اما اگر از متد get() استفاده کنید، None برگردانده می شود یا مقدار پیش فرضی که شما تعیین کرده اید.

❓ آیا می توان از یک لیست به عنوان کلید در دیکشنری استفاده کرد؟

خیر، نمی توانید از یک لیست به عنوان کلید در دیکشنری استفاده کنید. کلیدهای دیکشنری باید غیر قابل تغییر (Immutable) باشند، اما لیست ها قابل تغییر هستند. در مقابل، تاپل ها (به شرطی که عناصرشان Immutable باشند) می توانند به عنوان کلید استفاده شوند.

❓ سریع ترین روش برای پیمایش (Loop) در آیتم های یک دیکشنری چیست؟

سریع ترین و کارآمدترین روش برای پیمایش در کلیدها و مقادیر یک دیکشنری به صورت همزمان، استفاده از متد items() است، مانند for key, value in my_dict.items():.

❓ تفاوت متد pop() با del در حذف آیتم ها چیست؟

متد pop() آیتم را حذف کرده و مقدار آن را برمی گرداند، در حالی که del فقط آیتم را حذف می کند و چیزی برنمی گرداند. همچنین، pop() امکان تعیین مقدار پیش فرض را در صورت عدم وجود کلید فراهم می کند، اما del در این حالت خطا می دهد.

📌 جمع بندی

دیکشنری ها در پایتون ابزاری قدرتمند برای سازماندهی و مدیریت داده ها به صورت جفت های کلید-مقدار هستند. با درک عمیق از نحوه عملکرد، متدها و محدودیت های آن ها، می توانید کدهای بهینه تر و کارآمدتری بنویسید. از ساخت دیکشنری با آکولاد گرفته تا استفاده از Dictionary Comprehension و متدهای پیشرفته، هر جنبه ای از دیکشنری به شما کمک می کند تا به یک برنامه نویس پایتون مسلط تر تبدیل شوید. این ساختار داده، به دلیل سرعت بالا در جستجو (O(1)) و انعطاف پذیری، در طیف وسیعی از کاربردها، از توسعه وب گرفته تا تحلیل داده، نقش حیاتی ایفا می کند.

✅ آماده اید دیکشنری ها را در پروژه هایتان به کار بگیرید؟

با دانلود فایل تمرینی و مثال های بیشتر، مهارت خود را در کار با دیکشنری ها تقویت کنید.

دانلود فایل تمرینی پایتون

دکمه بازگشت به بالا