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

توی قسمت قبل از آموزش پایتون رفتیم سراغ لیست ها و تو این قسمت از آموزش پایتون می خوایم بریم سراغ دیکشنری ها.
احتمالا همه تا الان حداقل یه بار از دیکشنری لغت استفاده کردین. شما دنبال یه کلمه می گردین، پیداش می کنید و توضیحش رو جلوش می بینید. همینطور که میدونید از یه کلمه دوتا تو دیکشنری نیست ولی توضیحات مشابه زیاد هست. دقیقا توی پایتون هم همین مورد رو داریم.
پس میشه اینطوری گفت که دیکشنری یه ظرفیه که حاوی تعداد کلید (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 میشه. مثالا در مثال پایین ما یک دیکشنری خالی تعریف کردیم بعد در خط دوم خواستیم که کلید 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 استفاده کنید.
قوانین ساخت دیکشنری:
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 آرگومان ** استفاده کنید تا جفت های کلید و مقدار در یک دیکشنری را در آرگومان های یک تابع قرار دهید:
>>> 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'}
همانطور که این مثال نشان می دهد، کلیدهای تکراری با آخرین مقدار خود برابر می شوند.
مانند لیست ها و تاپل ها، می توانید یک کاما دنبال دار را در دیکشنری خود وارد کنید:
role = {"By day": "A typical programmer", "By night": "Still a typical programmer", }
از سازنده ( )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}]
اگه سوالی داشتید کامنت کنید