آموزش پایتون - دیکشنری‌ها

دیکشنری‌ها در پایتون

در پایتون، دیکشنری یک نوع دادهٔ داخلی است که داده‌ها را به‌صورت جفت‌های کلید و مقدار ذخیره می‌کند. دیکشنری مجموعه‌ای تغییرپذیر است که ترتیب درج عناصر در آن حفظ می‌شود. هر کلید باید یکتا و هش‌پذیر باشد و مقادیر را می‌توان با استفاده از کلیدهای متناظر آن‌ها بازیابی کرد. دیکشنری‌ها اغلب برای ذخیره‌سازی داده‌های مرتبط به کار می‌روند؛ برای مثال، اطلاعات مربوط به یک موجودیت یا شیء مشخص که در آن می‌توان بر اساس کلید، مقدار موردنظر را به‌سرعت بازیابی کرد.

دیکشنری در پایتون نمونه‌ای از نوع دادهٔ نگاشت است. یک شیء نگاشت، مقدار یک شیء را به شیء دیگری «نگاشت» می‌کند. برای ایجاد ارتباط بین یک کلید و مقدار آن، از علامت دونقطه (:) بین این دو استفاده می‌شود.

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

در ادامه، چند نمونه از اشیای دیکشنری در پایتون آورده شده است:

capitals = {"Maharashtra":"Mumbai", "Gujarat":"Gandhinagar", "Telangana":"Hyderabad", "Karnataka":"Bengaluru"}
numbers = {10:"Ten", 20:"Twenty", 30:"Thirty",40:"Forty"}
marks = {"Savita":67, "Imtiaz":88, "Laxman":91, "David":49}

ویژگی‌های اصلی دیکشنری‌ها

ویژگی‌های اصلی دیکشنری‌ها عبارت‌اند از:

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

  • تغییرپذیری − پس از ایجاد دیکشنری، می‌توانید عناصر آن را تغییر دهید، عناصر جدیدی اضافه کنید یا عناصر موجود را حذف کنید.

  • دسترسی بر اساس کلید − دیکشنری‌ها اندیس‌های عددی ندارند. در عوض، برای دسترسی به مقادیر مرتبط با عناصر از کلیدها استفاده می‌شود.

  • کلیدهای یکتا − هر کلید در یک دیکشنری باید یکتا باشد. اگر سعی کنید مقداری را به یک کلید موجود اختصاص دهید، مقدار قبلی با مقدار جدید جایگزین می‌شود.

  • پشتیبانی از انواع دادهٔ مختلف − مقادیر موجود در دیکشنری می‌توانند از هر نوع داده‌ای باشند. کلیدها نیز می‌توانند انواع متفاوتی داشته باشند، به شرط آنکه هر کلید هش‌پذیر باشد.

مثال ۱

فقط اشیای هش‌پذیر را می‌توان به‌عنوان کلید استفاده کرد؛ مانند عدد، رشته یا تاپل (که فقط شامل عناصر هش‌پذیر باشد). برای مقدار می‌توانید از شیئی با هر نوعی استفاده کنید. بنابراین، تعریف‌های دیکشنری زیر نیز معتبر هستند:

d1 = {"Fruit":["Mango","Banana"], "Flower":["Rose", "Lotus"]}
d2 = {('India, USA'):'Countries', ('New Delhi', 'New York'):'Capitals'}
print (d1)
print (d2)

خروجی زیر تولید می‌شود:

{'Fruit': ['Mango', 'Banana'], 'Flower': ['Rose', 'Lotus']}
{'India, USA': 'Countries', ('New Delhi', 'New York'): 'Capitals'}

مثال ۲

پایتون اشیای غیرهش‌پذیر، مانند لیست، را به‌عنوان کلید نمی‌پذیرد و خطای TypeError ایجاد می‌کند.

d1 = {["Mango","Banana"]:"Fruit", "Flower":["Rose", "Lotus"]}
print (d1)

این کد خطای TypeError ایجاد می‌کند:

Traceback (most recent call last):
   File "C:\Users\Sairam\PycharmProjects\pythonProject\main.py", line 8, in <module>
d1 = {["Mango","Banana"]:"Fruit", "Flower":["Rose", "Lotus"]}
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: unhashable type: 'list'

مثال ۳

می‌توانید یک مقدار را به چند کلید در یک دیکشنری اختصاص دهید، اما یک کلید نمی‌تواند بیش از یک بار در همان دیکشنری ظاهر شود.

d1 = {"Banana":"Fruit", "Rose":"Flower", "Lotus":"Flower", "Mango":"Fruit"}
d2 = {"Fruit":"Banana","Flower":"Rose", "Fruit":"Mango", "Flower":"Lotus"}
print (d1)
print (d2)

خروجی زیر تولید می‌شود:

{'Banana': 'Fruit', 'Rose': 'Flower', 'Lotus': 'Flower', 'Mango': 'Fruit'}
{'Fruit': 'Mango', 'Flower': 'Lotus'}

ایجاد دیکشنری

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

مثال

مثال زیر نحوهٔ ایجاد دیکشنری را با استفاده از آکولادها و تابع dict() نشان می‌دهد:

# Creating a dictionary using curly braces
sports_player = {
   "Name": "Sachin Tendulkar",
   "Age": 48,
   "Sport": "Cricket"
}
print ("Dictionary using curly braces:", sports_player)
# Creating a dictionary using the dict() function
student_info = dict(name="Alice", age=21, major="Computer Science")
print("Dictionary using dict():",student_info)  

نتیجهٔ تولیدشده به‌صورت زیر است:

Dictionary using curly braces: {'Name': 'Sachin Tendulkar', 'Age': 48, 'Sport': 'Cricket'}
Dictionary using dict(): {'name': 'Alice', 'age': 21, 'major': 'Computer Science'}

دسترسی به عناصر دیکشنری

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

student_info = {
   "name": "Alice",
   "age": 21,
   "major": "Computer Science"
}
# Accessing values using square brackets
name = student_info["name"]
print("Name:",name)  

# Accessing values using the get() method
age = student_info.get("age")
print("Age:",age)  

نتیجهٔ به‌دست‌آمده به‌صورت زیر است:

Name: Alice
Age: 21

تغییر عناصر دیکشنری

می‌توانید مقدار مرتبط با یک کلید مشخص را تغییر دهید یا یک جفت کلید و مقدار جدید اضافه کنید:

student_info = {
   "name": "Alice",
   "age": 21,
   "major": "Computer Science"
}
# Modifying an existing key-value pair
student_info["age"] = 22

# Adding a new key-value pair
student_info["graduation_year"] = 2023
print("The modified dictionary is:",student_info)

خروجی کد بالا به‌صورت زیر است:

The modified dictionary is: {'name': 'Alice', 'age': 22, 'major': 'Computer Science', 'graduation_year': 2023}

حذف عناصر دیکشنری

می‌توانید با استفاده از دستور del، متد pop() یا متد popitem() عناصر دیکشنری را حذف کنید:

student_info = {
   "name": "Alice",
   "age": 22,
   "major": "Computer Science",
   "graduation_year": 2023
}
# Removing an item using the del statement
del student_info["major"]

# Removing an item using the pop() method
graduation_year = student_info.pop("graduation_year")

print(student_info) 

خروجی کد بالا به‌صورت زیر است:

{'name': 'Alice', 'age': 22}

پیمایش عناصر دیکشنری

می‌توانید با استفاده از حلقه‌ها، کلیدها، مقادیر یا جفت‌های کلید و مقدار موجود در یک دیکشنری را پیمایش کنید:

student_info = {
   "name": "Alice",
   "age": 22,
   "major": "Computer Science",
   "graduation_year": 2023
}
# Iterating through keys
for key in student_info:
   print("Keys:",key, student_info[key])

# Iterating through values
for value in student_info.values():
   print("Values:",value)

# Iterating through key-value pairs
for key, value in student_info.items():
   print("Key:Value:",key, value) 

پس از اجرای کد بالا، خروجی زیر را دریافت می‌کنیم:

Keys: name Alice
Keys: age 22
Keys: major Computer Science
Keys: graduation_year 2023
Values: Alice
Values: 22
Values: Computer Science
Values: 2023
Key:Value: name Alice
Key:Value: age 22
Key:Value: major Computer Science
Key:Value: graduation_year 2023

ویژگی‌های کلیدهای دیکشنری

مقادیر دیکشنری هیچ محدودیتی ندارند. آن‌ها می‌توانند هر شیء دلخواهی در پایتون باشند؛ چه اشیای استاندارد و چه اشیایی که کاربر تعریف کرده است. اما این موضوع دربارهٔ کلیدها صدق نمی‌کند.

دو نکتهٔ مهم دربارهٔ کلیدهای دیکشنری وجود دارد که باید به خاطر بسپارید:

  • برای هر کلید نمی‌توان بیش از یک ورودی داشت. این یعنی هیچ کلید تکراری مجاز نیست. اگر هنگام اختصاص مقادیر، کلیدهای تکراری وجود داشته باشند، آخرین مقدار اختصاص‌یافته معتبر خواهد بود. برای مثال:
dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'}
print ("dict['Name']: ", dict['Name'])

با اجرای کد بالا، نتیجهٔ زیر تولید می‌شود:

dict['Name']:  Manni
  • کلیدها باید هش‌پذیر باشند. یعنی می‌توانید از رشته‌ها، اعداد یا تاپل‌ها (که فقط شامل عناصر هش‌پذیر باشند) به‌عنوان کلید دیکشنری استفاده کنید، اما استفاده از چیزی مانند ['key'] مجاز نیست. مثال سادهٔ زیر این موضوع را نشان می‌دهد:
dict = {['Name']: 'Zara', 'Age': 7}
print ("dict['Name']: ", dict['Name'])

با اجرای کد بالا، نتیجهٔ زیر تولید می‌شود:

Traceback (most recent call last):
   File "test.py", line 3, in <module>
      dict = {['Name']: 'Zara', 'Age': 7};
TypeError: unhashable type: 'list'

عملگرهای دیکشنری در پایتون

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

d1 = {'a': 2, 'b': 4, 'c': 30}
d2 = {'a1': 20, 'b1': 40, 'c1': 60}
عملگر توضیحات مثال
dict[key] مقدار مرتبط با کلید را بازیابی یا به آن اختصاص می‌دهد print (d1['b']) مقدار 4 را بازیابی می‌کند

d1['b'] = 'Z' مقدار جدیدی را به کلید 'b' اختصاص می‌دهد

dict1|dict2 اتحاد دو شیء دیکشنری را انجام می‌دهد و یک شیء جدید برمی‌گرداند (پایتون 3.9 و بالاتر) d3=d1|d2 ; print (d3)

{'a': 2, 'b': 4, 'c': 30, 'a1': 20, 'b1': 40, 'c1': 60}

dict1|=dict2 عملگر اتحاد افزودهٔ دیکشنری‌ها (پایتون 3.9 و بالاتر) d1|=d2; print (d1)

{'a': 2, 'b': 4, 'c': 30, 'a1': 20, 'b1': 40, 'c1': 60}

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

پایتون متدهای زیر را برای دیکشنری‌ها ارائه می‌دهد:

شماره متدها و توضیحات
1 dict.clear()

تمام عناصر دیکشنری dict را حذف می‌کند.

2 dict.copy()

یک کپی سطحی از دیکشنری dict برمی‌گرداند.

3 dict.fromkeys()

یک دیکشنری جدید ایجاد می‌کند که کلیدهای آن از seq گرفته شده‌اند و مقادیرشان روی value تنظیم شده است.

4 dict.get(key, default=None)

برای کلید key، مقدار آن را برمی‌گرداند؛ اگر کلید در دیکشنری وجود نداشته باشد، مقدار پیش‌فرض را برمی‌گرداند.

5 dict.items()

یک شیء نمای از جفت‌های تاپل‌مانند (کلید، مقدار) دیکشنری dict برمی‌گرداند.

6 dict.keys()

یک شیء نمای از کلیدهای دیکشنری dict برمی‌گرداند.

7 dict.setdefault(key, default=None)

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

8 dict.update(dict2)

جفت‌های کلید و مقدار دیکشنری dict2 را به دیکشنری dict اضافه می‌کند.

9 dict.values()

یک شیء نمای از مقادیر دیکشنری dict برمی‌گرداند.

توابع داخلی قابل استفاده با دیکشنری‌ها

توابع داخلی زیر را می‌توان با دیکشنری‌ها استفاده کرد:

شماره تابع و توضیحات
1 len(dict)

طول کل دیکشنری را برمی‌گرداند. این مقدار برابر با تعداد عناصر موجود در دیکشنری است.

2 str(dict)

یک نمایش رشته‌ای قابل چاپ از دیکشنری تولید می‌کند.

3 type(variable)

نوع متغیر ارسال‌شده را برمی‌گرداند. اگر متغیر ارسال‌شده یک دیکشنری باشد، نوع دیکشنری را برمی‌گرداند.

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