هر چه می خوانم می فهمم بیشتر نمی دانم - دانش آموخته برق و کامپیوتر سابق
آموزش پایتون کلید ورود به دنیای هوش مصنوعی (گام دوم - قسمت شانزدهم:دیکشنری)
سلام رفقا
آموزش پایتون کلید ورود به دنیای هوش مصنوعی هست چرا که بسیاری از مباحث مطرح شده توی این زمینه از پایتون به عنوان برنامه نویسی استفاده می کنه. اگه تازه می خوای شروع کنی از این لینک به جلسه اول برو و گام به گام آموزش پایتون رو شروع کن بیا جلو.
ما الان اینجا هستیم :
توی قسمت قبل از آموزش پایتون رفتیم سراغ لیست ها و تو این قسمت از آموزش پایتون می خوایم بریم سراغ دیکشنری ها.
دیکشنری در پایتون چیه و به چه دردی می خوره ؟!
احتمالا همه تا الان حداقل یه بار از دیکشنری لغت استفاده کردین. شما دنبال یه کلمه می گردین، پیداش می کنید و توضیحش رو جلوش می بینید. همینطور که میدونید از یه کلمه دوتا تو دیکشنری نیست ولی توضیحات مشابه زیاد هست. دقیقا توی پایتون هم همین مورد رو داریم.
پس میشه اینطوری گفت که دیکشنری یه ظرفیه که حاوی تعداد کلید (key) و مقدار (value) هستش که هیچ کلیدی نمیتونه تکراری باشه ولی مقادیرش تکراری میتونه باشه. باید بگم که دیکشنری مرتب نیست و هیچ ترتیبی توش نیست ولی میشه بر اساس کلید، چیزایی که میخوایم رو پیدا کنیم. دیکشنری ها می توانند هر نوعی از داده باشند، اما غالبا از نوع داده ی عددی یا رشته ای هستند. مقدار (value) در دیکشنری می تواند هر نوعی باشد، ولی کلیدها باید یک نوع داده غیر قابل تغییر (immutable) مانند string، number، یا tuple باشند.
ساختن یک دیکشنری
ما از چند تا راه می تونیم این کارو بکنیم:
برای ایجاد دیکشنری از علامت های { } استفاده کنیم که کلید و مقدارش رو بهش می دیم:
d = { 'key': 'value' }
d = {1:'ad', 2:'cd'}
مثلا در مثال بالا کلید 1 مقدار Ad رو داره و کلید 2 مقدار Cd رو داره .
با کد زیر یک دیکشنری خالی ایجاد می کنیم:
d = { }
با خلاصه دیکشنری. مثلا توی این مثال مقدار a به صورت کلید قرار می گیره b مقدار اون میشه :
d = { k:v for k,v in [ ( 'key', 'value', ) ] }
d = {k:v for k,v in [('a','b',)]}
d
{'a':'b'}
با کلاس تو کار ( )dict :
d = dict() # empty dict
d = dict(key='value')
d = dict([('key', 'value')])
اصلاح یک دیکشنری:
برای اضافه کردن آیتم به دیکشنری، به سادگی یک کلید جدید با یک مقدار ایجاد کنید. مثلا در مثال زیر مقدار 42 با کلید newkey به دیکشنری d اضافه شده :
d['newkey'] = 42
>>> d
{'a': 'b', 'newkey': 42}
همینطور می تونید لیست و دیکشنری رو به عنوان یه مقدار اضافه کنید. در قسمت اول مثال زیر یک لیست از مقدایر 1و2و3 با کلید new_list اضافه شده و در قسمت دوم یک دیکشنری اضافه شده:
d['new_list'] = [1, 2, 3]
>>> d
{'a': 'b', 'newkey': 42, 'new_list': [1, 2, 3]}
d['new_dict'] = {'nested_dict': 1}
>>> d
{'a': 'b', 'newkey': 42, 'new_list': [1, 2, 3], 'new_dict': {'nested_dict': 1}}
برای حذف یک آیتم، کلید رو از دیکشنری حذف کنید. در مثال پایین newkey از دیکشنری به کلی حذف شده:
del d['newkey']
>>> d
{'a': 'b', 'new_list': [1, 2, 3], 'new_dict': {'nested_dict': 1}}
جلوگیری از ارور KeyError
یکی از مشکلاتی که وقتی ما داریم از دیکشنری ها استفاده می کنیم، ممکنه برامون پیش بیاد اینه که یه کلیدی ناموجود باشه. که این مشکل منجر به KeyError میشه. مثالا در مثال پایین ما یک دیکشنری خالی تعریف کردیم بعد در خط دوم خواستیم که کلید not there رو ببینیم که خطا داده چون این کلید وجود نداره:
mydict = {}
mydict['not there']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'not there'
یکی از راه های جلوگیری از KeyError اینه که از متد dict.get استفاده کنیم، که به شما این این امکان رو میده یه مقدار پیش فرضی برای بازگشت از کلیدی که نیست، مشخص کنیم:
value = mydict.get(key, default_value)
که در صورت وجود [mydict[key را برمی گرداند اما در غیر این صورت default_value را برمی گرداند. توجه داشته باشید که این دستور کلیدی به mydict اضافه نمی کند. بنابراین اگر می خواهید که مقدار و کلید را حفظ کنید، باید از (mydict.setdefault (key ، default_value استفاده کنید ، که این مقدار و کلید را ذخیره می کند. اگر به مثال زیر دقت کنید متوجه تفاوت این دوتا باهم میشید:
mydict = {}
print(mydict)
# {}
print(mydict.get("foo", "bar"))
# bar
print(mydict)
# {}
print(mydict.setdefault("foo", "bar"))
# bar
print(mydict)
# {'foo': 'bar'}
یک روش جایگزین برای مقابله با مشکل ، گرفتن استثناء(exception) است. درمورد try و catch در درس های بعدی توضیح می دم فقط یادتون باشه که میشه ازش استفاده کرد که خطاهای این مدلی رو کنترل کرد:
try:
value = mydict[key]
except KeyError:
value = default_value
همچنین می توانید بررسی کنید که کلید در دیکشنری است یا خیر:
if key in mydict:
value = mydict[key]
else:
value = default_value
پیمایش روی یک دیکشنری
اگر از یک فرهنگ لغت به عنوان یک تکرار کننده(iterator) استفاده می کنید، کلیدهای فرهنگ لغت رو می تونید مرور کنید. در مثال زیر a ، b ، c به صورت کلید هستن که با یک for روی این کلید ها حرکت می کنیم:
d = {'a': 1, 'b': 2, 'c':3}
for key in d:
print(key, d[key])
# c 3
# b 2
# a 1
همین مسئله به صورت خلاصه شده هم می تونه نوشته بشه :
print([key for key in d])
# ['c', 'b', 'a']
متد ( )items می تونه برای حلقه همزمان کلید و مقدار استفاده بشه. در واقع هم به کلید دسترسی داریم هم به مقدار :
for key, value in d.items():
print(key, value)
# c 3
# b 2
# a 1
می تونیم از متد ( )values برای پیمایش فقط روی مقادیر استفاده کرد:
for key, value in d.values():
print(key, value)
# 3
# 2
# 1
دیکشنری با مقادیر پیش فرض
در کتابخانه استاندارد defaultdict در دسترس است:
from collections import defaultdict
d = defaultdict(int)
d['key'] # 0
d['key'] = 5
d['key'] # 5
d = defaultdict(lambda: 'empty')
d['key'] # 'empty'
d['key'] = 'full'
d['key'] # 'full'
ادغام دیکشنری ها
دیکشنری های زیر را در نظر بگیرید:
>>> fish = {'name': "Nemo", 'hands': "fins", 'special': "gills"}
>>> dog = {'name': "Clifford", 'hands': "paws", 'color': "red"}
Python 3.5+
>>> fishdog = {**fish, **dog}
>>> fishdog
{'hands': 'paws', 'color': 'red', 'name': 'Clifford', 'special': 'gills'}
همانطور که این مثال نشان می دهد، کلیدهای تکراری با آخرین مقدار خود برابر می شوند.
Python 3.3+
>>> from collections import ChainMap
>>> dict(ChainMap(fish, dog))
{'hands': 'fins', 'color': 'red', 'special': 'gills', 'name': 'Nemo'}
تو این روش برای کلیدهای تکراری اولین مقدار ملاک هست نه آخرین مقدار.
Python 2.x, 3.x
>>> from itertools import chain
>>> dict(chain(fish.items(), dog.items()))
{'hands': 'paws', 'color': 'red', 'name': 'Clifford', 'special': 'gills'}
تو این روش هم واسه کلیدهای تکراری آخرین مقدار رو در نظر می گیره.
>>> fish.update(dog)
>>> fish
{'color': 'red', 'hands': 'paws', 'name': 'Clifford', 'special': 'gills'}
متد dict.update از دیکشنری دوم برای بازنویسی قبلی استفاده می کند.
دسترسی به کلیدها و مقدارها
هنگام کار با دیکشنری ها، اغلب لازم است به همه کلیدها و مقادیر موجود در دیکشنری، چه به صورت حلقه for، خلاصه لیست، یا فقط به عنوان یک لیست ساده، دسترسی پیدا کنید.
دیکشنری زیر رو در نظر بگیرید:
mydict = {
'a': '1',
'b': '2'
}
با استفاده از متد ( )keys میتونید لیستی از کلیدها بگیرید:
print(mydict.keys())
# Python2: ['a', 'b']
# Python3: dict_keys(['b', 'a'])
ولی اگر لیستی از مقادیر رو می خواهید، از متد ( )values استفاده کنید:
print(mydict.values())
# Python2: ['1', '2']
# Python3: dict_values(['2', '1'])
اگر می خواهید با کلید و مقدار متناظر آن کار کنید، از متد ( )items استفاده کنید:
print(mydict.items())
# Python2: [('a', '1'), ('b', '2')]
# Python3: dict_items([('b', '2'), ('a', '1')])
توجه کنید که از اونجایی که یک دیکشنری مرتب نشده هست، متدهای بالا هم نامرتب هستند. اگر به ترتیب این متدها اهمیت میدید، از ( )sort( ) ،sorted یا OrderedDict استفاده کنید.
ساختن یک دیکشنری
قوانین ساخت دیکشنری:
- هر کلید باید منحصر به فرد باشد (در غیر این صورت نادیده گرفته می شود)
- همه کلیدها باید hashable باشند (می تونیم با استفاده از تابع hash اون رو هش کنیم. در غیر این صورت TypeError میده)
- کلیدها نامرتب هستند.
stock = {'eggs': 5, 'milk': 2}
دیکشنری خالی:
dictionary = { }
dictionary['eggs'] = 5
dictionary['milk'] = 2
مقادیر میتونند لیست هم باشند:
mydict = {'a': [1, 2, 3], 'b': ['one', 'two', 'three']}
برای اضافه کردن عناصر جدید به لیست مقادیر از متد ( )list.append استفاده کنید:
mydict['a'].append(4) # => {'a': [1, 2, 3, 4], 'b': ['one', 'two', 'three']}
mydict['b'].append('four') # => {'a': [1, 2, 3, 4], 'b': ['one', 'two', 'three', 'four']}
همچنین می توانیم با استفاده از لیستی از تاپل ها، دیکشنری ایجاد کنیم:
iterable = [('eggs', 5), ('milk', 2)]
dictionary = dict(iterables)
dictionary = dict(eggs=5, milk=2)
یه را دیگه اینه که از dict.fromkeys استفاده کنید:
dictionary = dict.fromkeys((milk, eggs)) # => {'milk': None, 'eggs': None}
dictionary = dict.fromkeys((milk, eggs), (2, 5)) # => {'milk': 2, 'eggs': 5}
ساختن یک دیکشنری مرتب
با استفاده از دستور OrderedDict از ماژول collections. این کار همیشه در هنگام پیمایش، عناصر دیکشنری را به ترتیب درج اصلی برمی گرداند:
from collections import OrderedDict
d = OrderedDict()
d['first'] = 1
d['second'] = 2
d['third'] = 3
d['last'] = 4
# Outputs "first 1", "second 2", "third 3", "last 4"
for key in d:
print(key, d[key])
عمل Unpacking کردن دیکشنری با استفاده از عملگر **
می توانید از اپراتور Unpacking آرگومان ** استفاده کنید تا جفت های کلید و مقدار در یک دیکشنری را در آرگومان های یک تابع قرار دهید:
>>> def parrot(voltage, state, action):
... print("This parrot wouldn't", action, end=' ')
... print("if you put", voltage, "volts through it.", end=' ')
... print("E's", state, "!")
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
از پایتون 3.5 به بعد نیز می توانید از این ** برای ادغام تعداد دلخواه اشیاء دیکشنری استفاده کنید:
>>> fish = {'name': "Nemo", 'hands': "fins", 'special': "gills"}
>>> dog = {'name': "Clifford", 'hands': "paws", 'color': "red"}
>>> fishdog = {**fish, **dog}
>>> fishdog
{'hands': 'paws', 'color': 'red', 'name': 'Clifford', 'special': 'gills'}
همانطور که این مثال نشان می دهد، کلیدهای تکراری با آخرین مقدار خود برابر می شوند.
کامای (comma) دنباله دار
مانند لیست ها و تاپل ها، می توانید یک کاما دنبال دار را در دیکشنری خود وارد کنید:
role = {"By day": "A typical programmer",
"By night": "Still a typical programmer", }
سازنده ( )dict
از سازنده ( )dict برای ساختن دیکشنری استفاده می کنیم:
dict(a=1, b=2, c=3) # {'a': 1, 'b': 2, 'c': 3}
dict([('d', 4), ('e', 5), ('f', 6)]) # {'d': 4, 'e': 5, 'f': 6}
dict([('a', 1)], b=2, c=3) # {'a': 1, 'b': 2, 'c': 3}
dict({'a' : 1, 'b' : 2}, c=3) # {'a': 1, 'b': 2, 'c': 3}
مثال دیکشنری ها
car = {}
car["wheels"] = 4
car["color"] = "Red"
car["model"] = "Corvette"
همونطور که میبینید مقدارها رو به کلیدها نسبت داده.
مقدارهای یه دیکشنری با استفاده از کلیدهایشان قابل دسترسی هستن:
print "Little " + car["color"] + " " + car["model"] + "!"
روی مقادیر دیکشنری میتونیم پیمایش انجام بدیم:
for key in car:
print key + ": " + car[key]
# wheels: 4
# color: Red
# model: Corvette
همه ترکیبات مقادیر دیکشنری
options = {
"x": ["a", "b"],
"y": [10, 20, 30]
}
در دیکشنری بالا، لیستی وجود داره که مجموعه ای از مقادیر را برای پیدا کردن کلید مربوطه نشان می دهد.
فرض کنید میخواهید x=a را با y=10 یا y=10 را با x=a پیدا کنید، تا زمانی که تمام ترکیبات ممکن را بررسی کرده باشید. با استفاده از کد زیر می توانید لیستی ایجاد کنید که تمام این ترکیبات از مقادیر را برگرداند:
import itertools
options = {
"x": ["a", "b"],
"y": [10, 20, 30]}
"y": [10, 20, 30]}
keys = options.keys()
values = (options[key] for key in keys)
combinations = [dict(zip(keys, combination)) for combination in itertools.product(*values)]
print combinations
لیست زیر رو برمی گردونه:
[{'x': 'a', 'y': 10},
{'x': 'b', 'y': 10},
{'x': 'a', 'y': 20},
{'x': 'b', 'y': 20},
{'x': 'a', 'y': 30},
{'x': 'b', 'y': 30}]
اگه سوالی داشتید کامنت کنید
مطلبی دیگر از این انتشارات
چگونه هوش مصنوعی بازار کار را به هم می زند!؟
مطلبی دیگر از این انتشارات
چگونگی کار با الگوریتم درخت تصمیم به کمک کتابخانه Scikit-Learn
مطلبی دیگر از این انتشارات
پایتون کلید ورود به دنیای هوش مصنوعی! (جمع بندی گام اول (بخش مقدماتی))