Skip to content

Commit e3efcaa

Browse files
author
Saeid
committed
edited l08.2 - dict
1 parent f340379 commit e3efcaa

File tree

1 file changed

+75
-50
lines changed

1 file changed

+75
-50
lines changed

source/lessons/l08-set-and-dict-in-python.rst

Lines changed: 75 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
:description: پایتون به پارسی - کتاب آنلاین و آزاد آموزش زبان برنامه‌نویسی پایتون - درس هشتم: ساختمان‌های داده در پایتون، set و dict
55
:keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, انواع شی, انواع داده, ساختمان‌های داده در پایتون, set در پایتون, dict در پایتون
66

7+
8+
9+
.. _lesson-08.2:
710

811
درس ۰۸: ساختمان‌های داده در پایتون: set و dict
912
====================================================================================
@@ -32,10 +35,12 @@
3235
----
3336

3437

38+
.. _python-dict:
39+
3540
دیکشنری
3641
---------
3742

38-
یکی دیگر از انواع انعطاف پذیر آماده در پایتون «**دیکشنری**» (Dictionary) می‌باشد که با نام کوتاه شده ``dict`` ارایه شده است. اشیا نوع دیکشنری با استفاده از نماد آکولاد ``{ }`` معرفی‌ می‌شوند و هر داده در آن به شکل یک جفت «**کلید:مقدار**» (key:value) ذخیره می‌گردد. از این نوع شی با عنوان شی mapping (نگاشت) پایتون نیز یاد می‌شود چرا که در این نوع هر شی «کلید» به یک شی «مقدار» map یا نگاشت داده می‌شود. شی دیکشنری دنباله نیست ولی تغییر پذیر بوده و «مقدار» هر عضو توسط «کلید» متناظر با آن دستیابی می‌شود. شی «مقدار» می‌تواند از هر نوعی باشد حتی یک شی دیکشنری دیگر ولی شی «کلید» تنها می‌بایست از انواع «تغییر ناپذیر» انتخاب شود و باید توجه داشت که تمام «کلید»‌های یک شی دیکشنری می‌بایست «**یکتا**» (Unique) باشند.
43+
یکی دیگر از انواع ساختمان‌های داده در پایتون «**دیکشنری**» (Dictionary) می‌باشد که با نام کوتاه شده ``dict`` ارایه شده است. اشیا نوع دیکشنری با استفاده از نماد آکولاد ``{ }`` معرفی‌ می‌شوند و هر داده در آن به شکل یک جفت «**کلید:مقدار**» (key:value) ذخیره می‌گردد. از این نوع شی با عنوان شی mapping (نگاشت) پایتون نیز یاد می‌شود چرا که در این نوع هر شی «کلید» به یک شی «مقدار» map یا نگاشت داده می‌شود. شی دیکشنری **دنباله نیست** و هر عضو آن به جای اندیس با استفاده از کلید دستیابی می‌شود. دیکشنری در پایتون **تغییر پذیر** است و شی «مقدار» می‌تواند از هر نوعی باشد حتی یک شی دیکشنری دیگر ولی شی «کلید» تنها می‌بایست از انواع «تغییرناپذیر» انتخاب شود و باید توجه داشت که تمام «کلید»‌های یک شی دیکشنری می‌بایست «**یکتا**» (Unique) باشند. از **نسخه 3.7 پایتون**، دیکشنری قابلیت حفظ ترتیب عناصر خود را نیز دارد یا به اصطلاح Ordered است.
3944

4045
::
4146

@@ -96,6 +101,20 @@
96101
>>> d['cb4f2']['age']
97102
40
98103

104+
105+
برای ایجاد شی دیکشنری می‌توان از کلاس ``()dict`` [`اسناد پایتون <http://docs.python.org/3/library/functions.html#func-dict>`__] نیز استفاده نمود::
106+
107+
108+
>>> d = dict(one=1, two=2, three=3)
109+
110+
>>> d
111+
{'two': 2, 'one': 1, 'three': 3}
112+
>>> d['one']
113+
1
114+
115+
توجه داشته باشید که عضوهای شی دیکشنری از طریق آرگومان‌ها و به شکل «**کلید=مقدار**» به کلاس فرستاده می‌شوند و در این حالت برای انتخاب کلیدها باید قوانین انتخاب نام در پایتون را رعایت نماییم؛ برای مثال کلیدی که با عدد شروع شود مجاز نمی‌باشد.
116+
117+
99118

100119

101120
ساختار نوع دیکشنری مشابه «جدول درهم‌سازی» (`Hash table <https://en.wikipedia.org/wiki/Hash_table>`_) است و کاربرد‌های فراوانی در الگوریتم‌های جستجو دارد. از این نوع همچنین می‌توان برای سازماندهی و ذخیره داده‌ها بر روی فایل استفاده کرد؛ برای نمونه فرض کنید می‌خواهیم چند فیلم با بازی Benedict Cumberbatch را به گونه‌ای در اختیار داشته باشیم که بتوانیم آن‌ها را بر اساس سال ساخت دستیابی نماییم::
@@ -133,13 +152,12 @@
133152

134153
>>> d['job'] = 'unemployed'
135154
>>> d
136-
{'name': 'Jhon', 'job': 'unemployed', 'age': 40}
155+
{'name': 'Jhon', 'age': 40, 'job': 'unemployed'}
137156

138-
*برخلاف شی لیست یا تاپل (یا در کل دنباله‌ها) که داده‌هایی منظم (Ordered) هستند و ترتیب یا جایگاه قرار گرفتن عضوهای آن‌ها اهمیت دارد، یک شی دیکشنری این طور نیست و ترتیب عضوها در آن کاملا بی اهمیت است.*
139157

140158
با استفاده از دستوری مشابه ``[del dic[key`` نیز می‌توان یک عضو شی دیکشنری را حذف کرد::
141159

142-
>>> d = {'name': 'Jhon', 'job': 'unemployed', 'age': 40}
160+
>>> d = {'name': 'Jhon', 'age': 40, 'job': 'unemployed'}
143161

144162
>>> del d['job']
145163
>>> d
@@ -148,15 +166,19 @@
148166

149167
امکانی برای تغییر کلیدها وجود ندارد مگر آنکه عضو مورد نظر را حذف کرده و یک عضو جدید (همان مقدار ولی با کلیدی جدید) اضافه نمایید::
150168

151-
>>> d = {'name': 'Jhon', 'job': 'unemployed', 'age': 40}
169+
>>> d = {'name': 'Jhon', 'age': 40, 'job': 'unemployed'}
152170

153171
>>> d['occupation'] = d['job']
154172
>>> del d['job']
155173

156174
>>> d
157175
{'name': 'Jhon', 'age': 40, 'occupation': 'unemployed'}
176+
158177

159-
.. rubric:: عملگرها برای دیکشنری
178+
.. _python-dict-operators:
179+
180+
عملگرها برای دیکشنری
181+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
160182

161183
عملگرهای ``+`` و ``*`` برای اشیا دیکشنری تعریف **نشده‌اند**.
162184

@@ -171,7 +193,10 @@
171193
در مورد عملکرد عملگر برابری ``==`` و عملگرهای هویت (``is`` و ``is not``) صحبت شده است؛ این عملگرها برای اشیا دیکشنری نیز کاربرد دارند.
172194

173195

174-
.. rubric:: کپی کردن
196+
.. _python-dict-copy:
197+
198+
کپی کردن
199+
~~~~~~~~~~~~~~~~~~
175200

176201
همانطور که گفته شد شی دیکشنری از انواع «تغییر پذیر» پایتون است و همان توضیحاتی که در مورد شی لیست بیان شد؛ در اینجا هم درست است و گاهی نیاز می‌شود که از ماژول ``copy`` برای کپی اشیا دیکشنری استفاده نماییم:
177202

@@ -253,21 +278,47 @@
253278
>>> d2
254279
{'ages': [40, 40], 'names': ['Bob', 'Jhon']}
255280

281+
282+
.. _python-convert-to-dict:
256283

257-
.. rubric:: تبدیل به شی دیکشنری
284+
تبدیل به شی دیکشنری
285+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
258286

259-
برای تبدیل دیگر اشیا به نوع دیکشنری یا در کل ایجاد شی دیکشنری از کلاس ``()dict`` [`اسناد پایتون <http://docs.python.org/3/library/functions.html#func-dict>`__] استفاده می‌شود. توجه داشته باشید که عضوهای شی دیکشنری از طریق آرگومان‌ها و به شکل «**کلید=مقدار**» به کلاس فرستاده می‌شوند::
287+
برای تبدیل دیگر اشیا به نوع دیکشنری یا در کل ایجاد شی دیکشنری از کلاس ``()dict`` [`اسناد پایتون <http://docs.python.org/3/library/functions.html#func-dict>`__] استفاده می‌شود.
260288

261-
>>> d = dict(one=1, two=2, three=3)
262289

263-
>>> d
264-
{'two': 2, 'one': 1, 'three': 3}
265-
>>> d['one']
266-
1
290+
برای تبدیل اشیا دنباله به مانند لیست و تاپل به دیکشنری می‌بایست از ساختار تودرتو استفاده کرد، به گونه‌ای که هر عضو این ساختمان‌ها خود شامل دو عضو باشد::
291+
292+
>>> t = ('one', 'two', 'three')
293+
>>> type(t)
294+
<class 'tuple'>
295+
296+
>>> d = dict(t)
297+
Traceback (most recent call last):
298+
File "<stdin>", line 1, in <module>
299+
ValueError: dictionary update sequence element #0 has length 3; 2 is required
300+
301+
::
302+
303+
>>> t = ((1, 'one'), (2, 'two'), (3, 'three'))
304+
>>> dict(t)
305+
{1: 'one', 2: 'two', 3: 'three'}
306+
>>>
307+
308+
309+
البته می‌توان از یک مقدار پیش‌فرض نیز برای تبدیل نوع سریع آن‌ها به روش زیر بهره برد::
267310

268-
*در این حالت برای انتخاب کلیدها باید قوانین انتخاب نام در پایتون را رعایت نماییم؛ برای مثال کلیدی که با عدد شروع شود مجاز نمی‌باشد.*
269311

270-
برای فرستادن کلیدها و مقدارها می‌توانیم از تابع ``()zip`` [`اسناد پایتون <http://docs.python.org/3/library/functions.html#zip>`__] استفاده کنیم و خروجی این تابع را به عنوان آرگومان به کلاس ``dict`` ارسال کنیم. می‌توان اینگونه تصور کرد که این تابع تعدادی شی دنباله را می‌گیرد و عضوهای نظیر به نظیر آن‌ها را در کنار هم قرار می‌دهد؛ این دنباله‌ها باید تعداد عضو برابری داشته باشند؛ چرا که عضوهای اضافی هر دنباله نادیده گرفته می‌شود. خروجی ``()zip`` یک شی جدید از نوع ``zip`` است و برای مشاهده معمولا آن را به نوع لیست تبدیل می‌کنند::
312+
>>> t = ('one', 'two', 'three')
313+
>>> dict.fromkeys(t, "-")
314+
{'one': '-', 'two': '-', 'three': '-'}
315+
316+
>>> dict.fromkeys("Python", "-")
317+
{'P': '-', 'y': '-', 't': '-', 'h': '-', 'o': '-', 'n': '-'}
318+
319+
320+
321+
اما روش ساده‌تر، استفاده از تابع ``()zip`` [`اسناد پایتون <http://docs.python.org/3/library/functions.html#zip>`__] است. می‌توان اینگونه تصور کرد که این تابع تعدادی شی دنباله را می‌گیرد و عضوهای نظیر به نظیر آن‌ها را در کنار هم قرار می‌دهد؛ این دنباله‌ها باید تعداد عضو برابری داشته باشند؛ چرا که عضوهای اضافی هر دنباله نادیده گرفته می‌شود. خروجی ``()zip`` یک شی جدید از نوع ``zip`` است و می‌توان آن را به عنوان آرگومان به کلاس ``dict`` ارسال کنیم::
271322

272323
>>> k = [1, 2, 3, 4, 5]
273324
>>> v = ['x', 'y', 'z']
@@ -296,9 +347,10 @@
296347
در آینده باز هم از تابع ``()zip`` استفاده خواهیم کرد.
297348

298349

350+
.. _python-dict-methods:
299351

300-
301-
.. rubric:: برخی از متدهای کاربردی یک شی دیکشنری
352+
برخی از متدهای کاربردی یک شی دیکشنری
353+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
302354

303355
* ``()items`` [`اسناد پایتون <http://docs.python.org/3/library/stdtypes.html#dict.items>`__] تمام عضوهای شی را برمی‌گرداند - ``()values`` [`اسناد پایتون <http://docs.python.org/3/library/stdtypes.html#dict.values>`__] تمام مقدارهای موجود در شی را بر می‌گرداند - ``()keys`` [`اسناد پایتون <http://docs.python.org/3/library/stdtypes.html#dict.keys>`__] تمام کلیدهای موجود در شی را بر می‌گرداند::
304356

@@ -475,43 +527,16 @@
475527
{1: '0001', 2: 'Two', 3: 'Three', 5: 'Five', 6: 'Six'}
476528

477529

478-
479-
مجموعه
480-
--------
481-
482-
«**مجموعه**» (Set) از انواع «نامنظم» (Unordered) و «تغییر پذیر» (Mutable) پایتون است که معادل مفهوم مجموعه در ریاضیات می‌باشد. **هر عضو مجموعه می‌بایست یکتا و یکی از انواع «تغییر ناپذیر» باشد**. نوع مجموعه یا ``set`` در نسخه‌ 3x با کمی تفاوت ارایه شده است. در نسخه‌های 2x تنها می‌توان با استفاده از کلاس ``()set`` [`اسناد پایتون <http://docs.python.org/3/library/functions.html#func-set>`__] اقدام به ایجاد این اشیا نمود در حالی که در پایتون 3x این کار به سادگی و تنها با استفاده از نماد آکولاد ``{ }`` نیز امکان پذیر شده است؛ (البته این ویژگی به نسخه 2.7 هم پورت شده است). در دو نمونه کد پایین به چگونگی تعریف و نمایش شی مجموعه توجه نمایید:
483-
484-
*نسخه‌های 2x:*
485-
486-
::
487-
488-
>>> L = [1, 2, 3, 4, 5]
489-
490-
>>> s = set(L)
491-
492-
>>> type(s)
493-
<type 'set'>
494-
495-
>>> s
496-
set([1, 2, 3, 4, 5])
497-
498-
>>> print s
499-
set([1, 2, 3, 4, 5])
500-
501-
::
502-
503-
>>> s = {1, 2, 3, 4, 5} # Python 2.7
504530

505-
>>> type(s)
506-
<type 'set'>
507531

508-
>>> s
509-
set([1, 2, 3, 4, 5])
532+
.. _python-set:
510533

534+
535+
مجموعه
536+
--------
511537

512-
*نسخه‌های 3x:*
538+
«**مجموعه**» (Set) از انواع «بدون ترتیب» (Unordered) و «تغییر پذیر» (Mutable) پایتون است که برابر مفهوم مجموعه در ریاضیات می‌باشد. **هر عضو مجموعه می‌بایست یکتا و یکی از انواع «تغییر ناپذیر» باشد**. نوع مجموعه یا ``set`` را می‌توان با استفاده از کلاس ``()set`` [`اسناد پایتون <http://docs.python.org/3/library/functions.html#func-set>`__] یا تنها با استفاده از نماد آکولاد ``{ }`` ایجاد کرد::
513539

514-
::
515540

516541
>>> L = [1, 2, 3, 4, 5]
517542

0 commit comments

Comments
 (0)