|
4 | 4 | :description: پایتون به پارسی - کتاب آنلاین و آزاد آموزش زبان برنامهنویسی پایتون - درس هشتم: ساختمانهای داده در پایتون، set و dict
|
5 | 5 | :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, انواع شی, انواع داده, ساختمانهای داده در پایتون, set در پایتون, dict در پایتون
|
6 | 6 |
|
| 7 | + |
| 8 | + |
| 9 | +.. _lesson-08.2: |
7 | 10 |
|
8 | 11 | درس ۰۸: ساختمانهای داده در پایتون: set و dict
|
9 | 12 | ====================================================================================
|
|
32 | 35 | ----
|
33 | 36 |
|
34 | 37 |
|
| 38 | +.. _python-dict: |
| 39 | + |
35 | 40 | دیکشنری
|
36 | 41 | ---------
|
37 | 42 |
|
38 |
| -یکی دیگر از انواع انعطاف پذیر آماده در پایتون «**دیکشنری**» (Dictionary) میباشد که با نام کوتاه شده ``dict`` ارایه شده است. اشیا نوع دیکشنری با استفاده از نماد آکولاد ``{ }`` معرفی میشوند و هر داده در آن به شکل یک جفت «**کلید:مقدار**» (key:value) ذخیره میگردد. از این نوع شی با عنوان شی mapping (نگاشت) پایتون نیز یاد میشود چرا که در این نوع هر شی «کلید» به یک شی «مقدار» map یا نگاشت داده میشود. شی دیکشنری دنباله نیست ولی تغییر پذیر بوده و «مقدار» هر عضو توسط «کلید» متناظر با آن دستیابی میشود. شی «مقدار» میتواند از هر نوعی باشد حتی یک شی دیکشنری دیگر ولی شی «کلید» تنها میبایست از انواع «تغییر ناپذیر» انتخاب شود و باید توجه داشت که تمام «کلید»های یک شی دیکشنری میبایست «**یکتا**» (Unique) باشند. |
| 43 | +یکی دیگر از انواع ساختمانهای داده در پایتون «**دیکشنری**» (Dictionary) میباشد که با نام کوتاه شده ``dict`` ارایه شده است. اشیا نوع دیکشنری با استفاده از نماد آکولاد ``{ }`` معرفی میشوند و هر داده در آن به شکل یک جفت «**کلید:مقدار**» (key:value) ذخیره میگردد. از این نوع شی با عنوان شی mapping (نگاشت) پایتون نیز یاد میشود چرا که در این نوع هر شی «کلید» به یک شی «مقدار» map یا نگاشت داده میشود. شی دیکشنری **دنباله نیست** و هر عضو آن به جای اندیس با استفاده از کلید دستیابی میشود. دیکشنری در پایتون **تغییر پذیر** است و شی «مقدار» میتواند از هر نوعی باشد حتی یک شی دیکشنری دیگر ولی شی «کلید» تنها میبایست از انواع «تغییرناپذیر» انتخاب شود و باید توجه داشت که تمام «کلید»های یک شی دیکشنری میبایست «**یکتا**» (Unique) باشند. از **نسخه 3.7 پایتون**، دیکشنری قابلیت حفظ ترتیب عناصر خود را نیز دارد یا به اصطلاح Ordered است. |
39 | 44 |
|
40 | 45 | ::
|
41 | 46 |
|
|
96 | 101 | >>> d['cb4f2']['age']
|
97 | 102 | 40
|
98 | 103 |
|
| 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 | + |
99 | 118 |
|
100 | 119 |
|
101 | 120 | ساختار نوع دیکشنری مشابه «جدول درهمسازی» (`Hash table <https://en.wikipedia.org/wiki/Hash_table>`_) است و کاربردهای فراوانی در الگوریتمهای جستجو دارد. از این نوع همچنین میتوان برای سازماندهی و ذخیره دادهها بر روی فایل استفاده کرد؛ برای نمونه فرض کنید میخواهیم چند فیلم با بازی Benedict Cumberbatch را به گونهای در اختیار داشته باشیم که بتوانیم آنها را بر اساس سال ساخت دستیابی نماییم::
|
|
133 | 152 |
|
134 | 153 | >>> d['job'] = 'unemployed'
|
135 | 154 | >>> d
|
136 |
| - {'name': 'Jhon', 'job': 'unemployed', 'age': 40} |
| 155 | + {'name': 'Jhon', 'age': 40, 'job': 'unemployed'} |
137 | 156 |
|
138 |
| -*برخلاف شی لیست یا تاپل (یا در کل دنبالهها) که دادههایی منظم (Ordered) هستند و ترتیب یا جایگاه قرار گرفتن عضوهای آنها اهمیت دارد، یک شی دیکشنری این طور نیست و ترتیب عضوها در آن کاملا بی اهمیت است.* |
139 | 157 |
|
140 | 158 | با استفاده از دستوری مشابه ``[del dic[key`` نیز میتوان یک عضو شی دیکشنری را حذف کرد::
|
141 | 159 |
|
142 |
| - >>> d = {'name': 'Jhon', 'job': 'unemployed', 'age': 40} |
| 160 | + >>> d = {'name': 'Jhon', 'age': 40, 'job': 'unemployed'} |
143 | 161 |
|
144 | 162 | >>> del d['job']
|
145 | 163 | >>> d
|
|
148 | 166 |
|
149 | 167 | امکانی برای تغییر کلیدها وجود ندارد مگر آنکه عضو مورد نظر را حذف کرده و یک عضو جدید (همان مقدار ولی با کلیدی جدید) اضافه نمایید::
|
150 | 168 |
|
151 |
| - >>> d = {'name': 'Jhon', 'job': 'unemployed', 'age': 40} |
| 169 | + >>> d = {'name': 'Jhon', 'age': 40, 'job': 'unemployed'} |
152 | 170 |
|
153 | 171 | >>> d['occupation'] = d['job']
|
154 | 172 | >>> del d['job']
|
155 | 173 |
|
156 | 174 | >>> d
|
157 | 175 | {'name': 'Jhon', 'age': 40, 'occupation': 'unemployed'}
|
| 176 | + |
158 | 177 |
|
159 |
| -.. rubric:: عملگرها برای دیکشنری |
| 178 | +.. _python-dict-operators: |
| 179 | + |
| 180 | +عملگرها برای دیکشنری |
| 181 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
160 | 182 |
|
161 | 183 | عملگرهای ``+`` و ``*`` برای اشیا دیکشنری تعریف **نشدهاند**.
|
162 | 184 |
|
|
171 | 193 | در مورد عملکرد عملگر برابری ``==`` و عملگرهای هویت (``is`` و ``is not``) صحبت شده است؛ این عملگرها برای اشیا دیکشنری نیز کاربرد دارند.
|
172 | 194 |
|
173 | 195 |
|
174 |
| -.. rubric:: کپی کردن |
| 196 | +.. _python-dict-copy: |
| 197 | + |
| 198 | +کپی کردن |
| 199 | +~~~~~~~~~~~~~~~~~~ |
175 | 200 |
|
176 | 201 | همانطور که گفته شد شی دیکشنری از انواع «تغییر پذیر» پایتون است و همان توضیحاتی که در مورد شی لیست بیان شد؛ در اینجا هم درست است و گاهی نیاز میشود که از ماژول ``copy`` برای کپی اشیا دیکشنری استفاده نماییم:
|
177 | 202 |
|
|
253 | 278 | >>> d2
|
254 | 279 | {'ages': [40, 40], 'names': ['Bob', 'Jhon']}
|
255 | 280 |
|
| 281 | + |
| 282 | +.. _python-convert-to-dict: |
256 | 283 |
|
257 |
| -.. rubric:: تبدیل به شی دیکشنری |
| 284 | +تبدیل به شی دیکشنری |
| 285 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
258 | 286 |
|
259 |
| -برای تبدیل دیگر اشیا به نوع دیکشنری یا در کل ایجاد شی دیکشنری از کلاس ``()dict`` [`اسناد پایتون <http://docs.python.org/3/library/functions.html#func-dict>`__] استفاده میشود. توجه داشته باشید که عضوهای شی دیکشنری از طریق آرگومانها و به شکل «**کلید=مقدار**» به کلاس فرستاده میشوند:: |
| 287 | +برای تبدیل دیگر اشیا به نوع دیکشنری یا در کل ایجاد شی دیکشنری از کلاس ``()dict`` [`اسناد پایتون <http://docs.python.org/3/library/functions.html#func-dict>`__] استفاده میشود. |
260 | 288 |
|
261 |
| - >>> d = dict(one=1, two=2, three=3) |
262 | 289 |
|
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 | +البته میتوان از یک مقدار پیشفرض نیز برای تبدیل نوع سریع آنها به روش زیر بهره برد:: |
267 | 310 |
|
268 |
| -*در این حالت برای انتخاب کلیدها باید قوانین انتخاب نام در پایتون را رعایت نماییم؛ برای مثال کلیدی که با عدد شروع شود مجاز نمیباشد.* |
269 | 311 |
|
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`` ارسال کنیم:: |
271 | 322 |
|
272 | 323 | >>> k = [1, 2, 3, 4, 5]
|
273 | 324 | >>> v = ['x', 'y', 'z']
|
|
296 | 347 | در آینده باز هم از تابع ``()zip`` استفاده خواهیم کرد.
|
297 | 348 |
|
298 | 349 |
|
| 350 | +.. _python-dict-methods: |
299 | 351 |
|
300 |
| - |
301 |
| -.. rubric:: برخی از متدهای کاربردی یک شی دیکشنری |
| 352 | +برخی از متدهای کاربردی یک شی دیکشنری |
| 353 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
302 | 354 |
|
303 | 355 | * ``()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>`__] تمام کلیدهای موجود در شی را بر میگرداند::
|
304 | 356 |
|
|
475 | 527 | {1: '0001', 2: 'Two', 3: 'Three', 5: 'Five', 6: 'Six'}
|
476 | 528 |
|
477 | 529 |
|
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 |
504 | 530 |
|
505 |
| - >>> type(s) |
506 |
| - <type 'set'> |
507 | 531 |
|
508 |
| - >>> s |
509 |
| - set([1, 2, 3, 4, 5]) |
| 532 | +.. _python-set: |
510 | 533 |
|
| 534 | + |
| 535 | +مجموعه |
| 536 | +-------- |
511 | 537 |
|
512 |
| -*نسخههای 3x:* |
| 538 | +«**مجموعه**» (Set) از انواع «بدون ترتیب» (Unordered) و «تغییر پذیر» (Mutable) پایتون است که برابر مفهوم مجموعه در ریاضیات میباشد. **هر عضو مجموعه میبایست یکتا و یکی از انواع «تغییر ناپذیر» باشد**. نوع مجموعه یا ``set`` را میتوان با استفاده از کلاس ``()set`` [`اسناد پایتون <http://docs.python.org/3/library/functions.html#func-set>`__] یا تنها با استفاده از نماد آکولاد ``{ }`` ایجاد کرد:: |
513 | 539 |
|
514 |
| -:: |
515 | 540 |
|
516 | 541 | >>> L = [1, 2, 3, 4, 5]
|
517 | 542 |
|
|
0 commit comments