ساختمان داده dictionary که در این نوشتار واژه نامه خوانده می شود یکی دیگر ازپرکاربردترین ساختمان داده های موجود در پایتون است و همانندlist وtuple کاربرد اصلی آن ذخیره چندین مقدارمختلف در یک متغیر واحد و دسترسی به همه آنها تنها با یک نام مشخص است. واژه نامه داده ها را به صورت زوج های مقدار: کلید(key:value) ذخیره می کند. هر جفت key:value مقداری را به یک کلید یکتا نگاشت می کند. به زبان ساده تر در واژه نامه هر مقدار دارای کلید ویژه خود است. هر کلید در تمامی dictionary یکتاست اما مقدار ها می توانند تکراری باشند.
در پایتون یک dictionary به دو روش زیر ساخته می شود :
1- مقدار دهی مستقیم یک متغیر
در این روش زوج هایkey:value که با نویسه , از هم جدا می شوند درون یک جفت علامت کمان باز و بسته {})( قرار می گیرند و سپس با استفاده از عملگر جایگزینی = در متغیر مورد نظر ذخیره می شوند.
مثال: واژه نامه فرضی شماره تماس نمایندگی شرکت های فعال در صنعت خودروسازی در ایران
carsDict = {'Toyota':'021555', 'Peugeot':'021888' , 'Hundai':'021666'}
print(carsDict)
مثال: واژه نامه در بردارنده اطلاعات یک کارمند شامل : نام ، نام خانوادگی ، حقوق ، وزن و قد
emploees = {
'name':'arash',
'family':'izanlou',
'salary':70000000,
'height':1.85,
'weight':78}
print(emploees)
2- استفاده از سازنده کلاس dictionary
مثال:
student = dict(name = "arash" , Average = 19.5, schoolName = "Farhangian")
print(student)
مثال: ساخت واژه نامه از روی یک list در بردارنده tuple هایی که هر tuple بیانگر ارتفاع از سطح دریا های آزاد یک پایتخت است
list1 = [('tehran',1830), ('paris',34),('Tokyo',17)]
myDict = dict(list1)
print(myDict)
مثال:
a = dict(one=1, two=2, three=3)
b = {'one': 1, 'two': 2, 'three': 3}
c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
d = dict([('two', 2), ('one', 1), ('three', 3)])
e = dict({'three': 3, 'one': 1, 'two': 2})
f = dict({'one': 1, 'three': 3}, two=2)
print(a == b == c == d == e == f) #output is : True
print(a) #output is:{'one': 1, 'two': 2, 'three': 3}
3- استفاده از شیوه واژه نامه برگزیده
واژه نامه برگزیده یک شیوه ساده در پایتون برای ساخت یک واژه نامه جدید از روی یک شی قابل پیمایش موجود است. برای مثال می خواهیم واژه نامه ای ایجاد کنیم که در هر زوج key:value آن اعداد 1 تا 6 به عنوان کلید و مربع هرعدد به عنوان مقدار در نظر گرفته شوند:
myDict = {x:x**2 for x in range(1,7)}
print(myDict)
#output :{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36}
مثال :
keys = {100, 102, 200, 202}
values = {'arash', 'arman','sepideh', 'dariush'}
mydict = { k : v for (k, v) in zip(keys, values) }
print(mydict)
مثال :
dict1 = { x.upper() : x * 3 for x in "iran" }
print(dict1)
#output is : {'I': 'iii', 'R': 'rrr', 'A': 'aaa', 'N': 'nnn'}
1- واژه نامه یک شی قابل تغییر[1] است به این معنی که پس از تعریف و مقدار دهی اولیه به آن می توان عناصر موجود در آن را حذف کرد ، تغییر داد و یا عناصری جدیدی به آن افزود.
2- در زوج های key:value ذخیره شده در یک واژه نامه کلید یکتاست و نمی تواند تکراری باشد اما مقدارها می توانند تکراری باشند. به زبان ساده تر هیچ دو مقداری در یک واژه نامه دارای کلید یکسان نیستند.
3- در زوج های key:value موجود در یک واژه نامه ، مقدار(value) می تواند هر نوع داده ای را داشته باشد یعنی می تواند از نوع عددی ، رشته ، list ، tuple و ... باشد.
عناصر موجود در یک واژه نامه یا همان زوج های key:value با استفاده از کلید خود ، شاخص گذاری می شوند بنا براین می توان با قراردادن کلید هر عنصر درون عملگر انتخاب (جفت علامت [] که پس از نام واژه نامه می آید) به مقدار آن دست یافت.
مثال :
student = dict(name = "arash" , Average = 19.5, schoolName = "Farhangian")
print(student['name'])
print(student['Average'])
print(student['schoolName'])
روش دیگر دستیابی به مقدار ذخیره شده در هر یک از زوجهای key:value استفاده از شگرد get() موجود در کلاس dictionary است.
مثال :
student = dict(name = "arash" , Average = 19.5, schoolName = "Farhangian")
print(student.get('name'))
print(student.get('Average'))
print(student.get('schoolName'))
دیگر روشدستیابی به عناصرموجود در یک واژه نامه ، بکارگیری شگرد items() است. این شگرد هر زوج key:value موجود در واژه نامه را در قالب یک tuple به شکل (key, value) ذخیره می کند سپس تمامی tuple های بدست آمده را در یک شی قابل پیمایش از نوع dict_items قرار می دهد. مهم است بدانید که شی برگشت داده شده توسط این شگرد یک نما (view) از واژه نامه است بنابراین هر تغییری در واژه نامه بی درنگ در آن بازتاب خواهد یافت.
مثال :
student = dict(name = "arash" , Average = 19.5, schoolName = "Farhangian")
studentItems= student.items()
print(studentItems)
#output dict_items([('name', 'arash'), ('Average', 19.5), ('schoolName', 'Farhangian')])
شی بدست آمده از اجرای شگرد items() قابل پیمایش است بنابراین می توان همانند مثال زیر آن را پیمایش کرد :
مثال :
student = dict(name = "arash" , Average = 19.5, schoolName = "Farhangian")
for itm in student.items():
print(itm)
خروجی کد بالا همانند زیر است :
('name', 'arash')
('Average', 19.5)
('schoolName', 'Farhangian')
شگرد keys() موجود در کلاس dictionary فهرستی از کلیدهای موجود در واژه نامه را در قالب یک شی قابل پیمایش از نوع dict_keys برمی گرداند. شی برگشت داده شده توسط این شگرد یک نما (view) از کلید های واژه نامه است بنابراین هر تغییری در کلیدهای واژه نامه بی درنگ در آن بازتاب خواهد یافت.
مثال :
student = dict(name = "arash" , Average = 19.5, schoolName = "Farhangian")
studentKeys = student.keys()
for k in studentKeys:
print(k)
شگرد values() موجود در کلاس dictionary فهرستی از مقدارهای موجود در واژه نامه را در قالب یک شی قابل پیمایش از نوع dict_values برمی گرداند. شی برگشت داده شده توسط این شگرد یک نما (view) از مقدارهای ذخیره شده در واژه نامه است بنابراین هر تغییری در مقدارهای واژه نامه بی درنگ در آن بازتاب خواهد یافت.
مثال :
student = dict(name = "arash" , Average = 19.5, schoolName = "Farhangian")
studentValues = student.values()
print(type(studentValues))
for v in studentValues:
print(v)
به تعداد زوج های key:value موجود در یک واژه نامه طول واژه نامه گفته می شود برای بدست آوردن طول یک واژه نامه می توانید از تابعlen() استفاده کنید.
مثال :
student = dict(name = "arash" , Average = 19.5, schoolName = "Farhangian")
length = len(student)
print(length) #OutPut is 3
برای اطمینان از موجود بودن یک کلید در واژه نامه مورد نظرمی توانید از دستور if به همراه عملگر in استفاده کنید
مثال :
student = dict(name = "arash" , Average = 19.5, schoolName = "Farhangian")
if "name" in student:
print("name key is in student dictionary")
یا
student = dict(name = "arash" , Average = 19.5, schoolName = "Farhangian")
if "name" in student.keys():
print("name key is in student dictionary")
برای اطمینان از اینکه کلید مورد نظر در واژه نامه وجود ندارد می توانید از دستور if به همراه عملگر not in استفاده کنید
مثال :
student = dict(name = "arash" , Average = 19.5, schoolName = "Farhangian")
if "family" not in student:
print("family key is not in student dictionary")
یا
student = dict(name = "arash" , Average = 19.5, schoolName = "Farhangian")
if "family" not in student.keys():
print("family key is not in student dictionary")
همانگونه که گفته شد واژه نامه یک شی قابل تغییر است به این معنی که پس از تعریف و مقدار دهی اولیه به آن می توان عناصر موجود در آن را حذف کرد ، تغییر داد و یا عناصری جدیدی به آن افزود. برای بروزرسانی مقدار یک کلید درdictionary دو روش وجود دارد :
1- دستیابی به مقدار یک کلید و تغییر آن با استفاده ازعملگر انتخاب [] و سپس انتساب = به شکل زیر:
yourDic['key '] = newValue
مثال:
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
CarDict['year '] = 2022
print(CarDict)
2- استفاده از شگرد update() موجود در کلاس dictionary
شگرد update() می تواند یک ورودی از نوع dictionary و یا هر شی قابل پیمایش دیگری که در بردارنده داده به شکل زوج های key:value باشد را پذیرفته و مقدار کلیدهای متناظر با ورودی خود را در واژه نامه تغییر دهد:
مثال :
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
CarDict.update({'brand':'Ford', 'model':'Mustang', 'year':1964})
print(CarDict)
#output {'brand': 'Ford', 'model': 'Mustang', 'year': 1964}
واژه نامه یک ساختمان داده تغییر پذیر است از این رو می توان عنصر جدیدی به آن افزود برای این منظور می توان عملگر انتخاب [] که دربردارنده کلید جدید باشد را همانند زیر و با استفاده از عملگر انتساب = مقداردهی کرد. با این کار در واژه نامه مورد نظر زوج key:value جدیدی ساخته می شود.
yourdict['NewKey'] = Value
مثال :
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
CarDict['country'] = 'japan'
print(CarDict)
#output {'brand': 'Toyota', 'model': 'prado', 'year': 2009, 'country': 'japan'}
شیوه دیگر افزودن یک عنصر به واژه نامه بکارگیری شگرد update() است که در بخش پیشین با آن آشنا شدید. این شگرد رفتار جالبی در رفتار با زوج های کلید : مقدار موجود در آرگومان دریافتی خود دارد بدین معنی که اگر هر یک از زوج های key:value موجود در آرگومان ، متناظر با هیچ یک از زوج های key:value موجود در واژه نامه نباشد یعنی کلید آن با هیچ یک از کلیدهای واژه نامه برابر نباشد زوج key:value به صورت یک عنصر جدید به واژه نامه افزوده خواهد شد
مثال :
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
CarDict.update({'country':'japan'})
print(CarDict)
#output {'brand': 'Toyota', 'model': 'prado', 'year': 2009, 'country': 'japan'}
برای حذف یک عنصراز واژه نامه چند روش مختلف وجود دارد که در زیر به برخی ازاین روشها میپردازیم :
1- شگرد pop() یک عنصر دارای کلیدمشخص را از واژه نامه حذف می کند
مثال :
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
CarDict.pop('year')
print(CarDict)
#output {'brand': 'Toyota', 'model': 'prado'}
2- تابع del() می تواند یک عنصر دارای کلید مشخص را از واژه نامه حذف کند.
مثال :
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
del(CarDict['year'])
print(CarDict)
#output {'brand': 'Toyota', 'model': 'prado'}
3- برای حذف کل یک dictionary می توانید از تابع del() استفاده کنید :
مثال :
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
del(CarDict)
print(CarDict)
در کد بالا واژه نامه CarDict به وسیله دستور del حذف می شود بنابراین با رسیدن اجرا به دستور print(CarDict) خطای زیر توسط مفسر پایتون اعلام خواهد شد :
NameError: name 'CarDict' is not defined
4- شگرد clear() برای پاک کردن تمامی زوجهای key:value موجود در یک واژه نامه استفاده می شود این شگرد تمامی عناصر موجود در واژه نامه را پاک می کند اما خود واژه نامه را باقی می گذارد و دوباره می توان عناصر جدیدی در آن ذخیره کرد.
مثال:
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
CarDict.clear()
print(CarDict)
#output {}
پیمایش یک واژه نامه به معنای حرکت در میان عناصر آن و خواندن مقدار هر یک از آنها به ترتیب ملاقات است. پیمایش یک فهرست با استفاده از حلقه for انجام می شود در این حالت آنچه که برگردانده می شود کلید های موجود در dictionary است نه مقادیر موجود در آن :
مثال :
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
for x in CarDict:
print(x)
خروجی کد بالا به شکل زیر است :
brand
model
year
مثال : چاپ تمامی مقادیر موجود در واژه نامه CarDict به روش پیمایش
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
for x in CarDict:
print(CarDict[x])
خروجی کد بالا به شکل زیر است :
Toyota
prado
2009
برای پیمایش یک واژه نامه می توانید از شگرد keys() در حلقه for هم استفاده کنید :
مثال :
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
for k in CarDict.keys():
print(k)
برای پیمایش تمامی مقادیر موجود در یک واژه نامه می توانید از شگرد values() در حلقه for استفاده کنید :
مثال :
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
for v in CarDict.values():
print(v)
برای پیمایش همزمان کلیدها و مقدارها می توان از شگرد items() بهره برد :
مثال :
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
for k, v in CarDict.items():
print(k , "--- " , v)
فرض کنید واژه نامهای به نام dict1 دارید و می خواهید از آن نسخهای به نام dict2 داشته باشید به زبان سادهتر قصد دارید تمامی عناصر موجود در واژهنامه dict1 درواژهنامه مستقلی به نام dict2 نیز قرارگیرند در نگاه اول به نظر می رسد که ساده ترین راه برآوردن این هدف استفاده از دستور انتساب سادهdict2 = dict1 باشد اما این راه حل نمی تواند منظور ما را برآورده کند چرا که در این حالت dict1 و dict2 هردو به یک مکان واحد در حافظه اصلی اشاره خواهند کرد یعنی هر دو دارای نشانی حافظه یکسان هستند به زبان ساده تر با اجرای دستورdict2=dict1 متغیرdict2 تنها یک ارجاع یا اشاره گر به dict1 است و یک dictionary مستقل نیست پس هر تغییری درdict1 به صورت خودکار در dict2 نیز بازتاب خواهد یافت . در پایتون هر متغیری شناسه یکتای خود را دارد که همان نشانی محل ذخیره سازی آن درحافظه است برای بدست آوردن شناسه یکتای هر متغیرازدستورid() استفاده می شود پس بنا برآنچه گفته شد در مثال زیر خروجی دستورid() برای هردو واژه نامه dict1 و dict2 یکسان خواهد بود.
dict1 = {'brand':'Toyota', 'model':'prado', 'year':2009}
dict2 = dict1
print(id(dict1))
print(id(dict2))
برای چیره شدن بر این مشکل در کلاس dictionary شگردی به نام copy() پیش بینی شده است که وظیفه آن ایجاد یک واژه نامه مستقل از یک واژه نامه موجود است به گونه ای که عناصر واژه نامه جدید همان عناصر واژه نامه موجود است.
مثال :
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
CarDict2 = CarDict.copy()
print(CarDict2)
# output {'brand': 'Toyota', 'model': 'prado', 'year': 2009}
روش دیگر رونوشت برداری از یک واژه نامه استفاده از سازنده کلاس Dictionary یعنی dict() است :
مثال :
CarDict = {'brand':'Toyota',
'model':'prado',
'year':2009}
CarDict2 = dict(CarDict)
print(CarDict2)
# output {'brand': 'Toyota', 'model': 'prado', 'year': 2009}
عناصر یک واژه نامه می توانند خود یک واژنامه باشند. به این دسته از واژه نامه ها واژه نامه های تودرتو گفته می شود برای مثال در کد زیر واژه نامه Car_info در بردارنده اطلاعات چهار نوع خودرو است :
Car_info = {
'car1':{'brand':'Toyota',
'model':'prado',
'year':2009} ,
'car2':{'brand':'Hyundai',
'model':'venue',
'year':2023} ,
'car3':{'brand':'Peugeot',
'model':'207',
'year':2021} ,
}
به منظور افزایش خوانایی کد نوشته شده می توانید هر واژه نامه را جداگانه تعریف و مقداردهی کنید و سپس به عنوان مقدار در واژه نامه Car_info استفاده کنید :
brand1= {'brand':'Toyota',
'model':'prado',
'year':2009}
brand2 = {'brand':'Hyundai',
'model':'venue',
'year':2023}
brand3 = {'brand':'Peugeot',
'model':'207',
'year':2021}
car_info = {
'car1': brand1 ,
'car2': brand2,
'car3': brand3
}
print(car_info)
برای دسترسی به یک عنصر خاص از واژه نامه های تودرتو باید به تعداد عمق واژه نامه از عملگر انتخاب [] استفاده کنید. برای مثال دستور زیر مقدار Hyundai را در خروجی چاپ خواهد کرد.
print(car_info['car2']['brand'])
مثال :
student1 = {'name':'arash', 'family':'izanlou'}
student2 = {'name':'arman', 'family':'iranmanesh'}
student3 = {'name':'dariush', 'family':'keyvan'}
team1 = {'sport' : 'footbal', 'student':student1}
team2 = {'sport' : 'tennis', 'student':student2}
team3 = {'sport' : 'volleyball', 'student':student3}
school_teams = {
'team1': team1 ,
'team2': team2,
'team3': team3
}
print(school_teams['team2']['student']['name'])
# output is : arman