1 - یک دیکشنری ساده

در این فصل نحوه‌ی به‌کارگیری دیکشنری‌ها را در پایتون می‌آموزید که به شما امکان متّصل کردن تکه‌هایی از اطّلاعاتِ مرتبط را می‌دهند. یاد می‌گیرید که چگونه پس از وارد کردن اطّلاعات به دیکشنری، به آن دسترسی پیدا کنید و چگونه آن‌ها را تغییر دهید. از‌آن‌جایی‌که می‌توان حجم نامحدودی از اطّلاعات را در یک دیکشنری ذخیره کرد، طریقه‌ی حلقه زدن در داده‌های یک دیکشنری را خواهید آموخت. علاوه بر این قرار دادن دیکشنری‌ها در لیست‌ها، لیست‌ها داخل دیکشنری‌ها و حتّی دیکشنری‌ها را در دیکشنری‌های دیگر می‌آموزید.

درک کردن دیکشنری‌ها به شما امکان می‌دهد که گستره‌ای از مسائل دنیای واقعی را به طور دقیق‌تر مدل کنید.

یک دیکشنری ساده

بازی‌ای را در نظر بگیرید که در آن تعداد موجود بیگانه با رنگ‌ها و ارزش امتیازی مختلف وجود دارد. این دیکشنری ساده اطّلاعات مربوط به یک موجود خاص را در بر می‌گیرد:

1
2
3
4
alien_0 = {'color': 'green', 'points': 5}

print(alien_0['color'])
print(alien_0['points'])

دیکشنری alien_0 رنگ و مقدار امتیاز حاصل از کشتن موجود بیگانه را ذخیره می‌کند. دو خطّ آخر به اطّلاعات دسترسی پیدا کرده و آن را نمایش می‌دهند:

1
2
green
5

همانندِ بیشترِ مفاهیمِ جدیدِ برنامه‌نویسی، به کار گرفتن دیکشنری‌ها نیازمند تمرین است. زمانی که کمی با دیکشنری‌ها کار کردید درخواهید یافت که آن‌ها چگونه با کارآمدی وضعیت‌های دنیای واقعی را مدل می‌کنند.

2 - کار کردن با دیکشنری

دیکشنری در پایتون مجموعه‌ای از جفت‌های کلید-مقدار است. هر کلید با یک مقدار مرتبط است و به کمک آن می‌توانید به این مقدارِ مرتبط دسترسی پیدا کنید. مقدار یک کلید می‌تواند عدد، رشته، لیست یا حتّی یک دیکشنری دیگر باشد.

در پایتون یک دیکشنری با دنباله‌ای از کلید-مقدارها، داخل آکُلاد {} قرار می‌گیرد:

1
alien_0 = {'color': 'green', 'points': 5}

یک جفت کلید-مقدار مجموعه‌ای از مقدارهای به هم مرتبط است. پایتون با ارائه‌ی هر کلید، مقداری را که با آن در ارتباط است برمی‌گرداند. هر کلید با یک دونقطه به مقدار خود وصل می‌شود و جفت‌های کلید-مقدارِ مجزّا با کاما از یکدیگر جدا می‌شوند.

دسترسی به مقادیر یک دیکشنری

برای گرفتن مقدار مرتبط با یک کلید، نام دیکشنری را بنویسید و سپس کلید را داخل یک جفت کروشه جلوی آن قرار دهید:

1
2
3
alien_0 = {'color': 'green'}

print(alien_0['color'])

این کد مقدار مربوط به کلید ‘color’ را از دیکشنری alien_0 برمی‌گرداند:

1
green

شما می‌توانید تعداد نامحدودی جفتِ کلید-مقدار در یک دیکشنری بگنجانید. اگر بازیکنی این موجود بیگانه را بکشد، امتیازِ کسب‌شده‌ی او با کدی به صورت زیر به دست می‌آید:

1
2
3
4
5
alien_0 = {'color': 'green', 'points': 5}

new_points = alien_0['points']

print(f"You just earned {new_points} points!")

کد 1 می‌تواند بلافاصله بعد از تعریفِ دیکشنری، مقدار مرتبط با کلید ‘points’ را از آن بیرون بکشد. این مقدار در ادامه به متغیّر new_points منسوب می‌شود. خط 2 درباره‌ی تعداد امتیازی که بازیکن دریافت کرده عبارتی چاپ می‌کند:

1
You just earned 5 points!

افزودن جفت‌های کلید-مقدار جدید

دیکشنری‌ها ساختارهایی پویا هستند و همیشه می‌توان جفت‌های کلید-مقدارِ جدید را به آن‌ها افزود. برای افزودن یک جفت کلید-مقدار، نام دیکشنری را همراه با کلید جدید، که در کروشه قرار گرفته، در کنارِ مقدار جدید می‌نویسید.

بیایید دو دانسته‌ی جدید به دیکشنری alien_0 بیفزاییم: مختصّات x و y آن:

1
2
3
4
5
6
7
8
alien_0 = {'color': 'green', 'points': 5}

print(alien_0)

alien_0['x_position'] = 0
alien_0['y_position'] = 25

print(alien_0)

مطابق قبل از تعریف یک دیکشنری شروع می‌کنیم. سپس آن را چاپ می‌کنیم. در 1 یک جفت کلید-مقدار جدید به آن اضافه می‌کنیم: کلید ‘x_position’ و مقدار 0. در 2 همین کار را برای کلید ‘y_position’ تکرار می‌کنیم:

1
2
3
{'color': 'green', 'points': 5}

{'color': 'green', 'points': 5, 'y_position': 25, 'x_position': 0}
نکته
از پایتون ۳.۷ به بعد، دیکشنری‌ها ترتیبی را که مطابق آن تعریف شده‌اند، حفظ می‌کنند. زمانی که یک دیکشنری را چاپ می‌کنید یا در آن حلقه می‌زنید، اعضای آن را به همان ترتیبِ افزوده شدن خواهید دید.

شروع کردن از یک دیکشنری خالی

گاهی ساده‌تر یا حتّی الزامی است که کار را از یک دیکشنری خالی شروع کرده و سپس موارد جدید را به آن اضافه کنیم:

1
2
3
4
5
6
alien_0 = {}

alien_0['color'] = 'green'
alien_0['points'] = 5

print(alien_0)

نتیجه همان دیکشنری‌ای است که در مثال‌های قبلی به کار می‌بردیم:

1
{'color': 'green', 'points': 5}

معمولاً هنگام ذخیره‌سازی داده‌هایی که کاربران ارائه می‌کنند یا نوشتن کدی که تعداد زیادی جفت کلید-مقدار را به طور خودکار تولید می‌کند، از دیکشنری‌های خالی استفاده می‌کنیم.

تغییر دادن مقدارها در یک دیکشنری

برای تغییر دادن مقداری در یک دیکشنری، نام آن را به همراه کلید در داخل کروشه بنویسید و سپس مقدار جدیدی را بیاورید:

1
2
3
4
5
6
7
alien_0 = {'color': 'green'}

print(f"The alien is {alien_0['color']}.")

alien_0['color'] = 'yellow'

print(f"The alien is now {alien_0['color']}.")

ابتدا دیکشنری alien_0 را تعریف می‌کنیم که تنها شامل رنگ آن است، سپس مقدار مرتبط با کلید ‘color’ را به ‘yellow’ تغییر می‌دهیم:

1
2
3
The alien is green.

The alien is now yellow.

به عنوان یک مثال جذّاب‌تر بیاید موقعیّت یک موجود بیگانه را که با سرعت‌های مختلف حرکت می‌کند ردگیری کنیم:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
alien_0 = {'x_position': 0, 'y_position': 25, 'speed': 'medium'}

print(f"Original position: {alien_0['x_position']}")

# Move the alien to the right.
# Determine how far to move the alien based on its current speed.
if alien_0['speed'] == 'slow':
    x_increment = 1

elif alien_0['speed'] == 'medium':
    x_increment = 2

else:
    # This must be a fast alien.
    x_increment = 3

# The new position is the old position plus the increment.
alien_0['x_position'] = alien_0['x_position'] + x_increment

print(f"New position: {alien_0['x_position']}")

در 1 یک زنجیره‌ی if-elif-else مشخّص می‌کند که موجود بیگانه چه‌قدر باید به سمت راست حرکت کند. پس از محاسبه شدن مقدارِ افزایشِ جابه‌جایی، آن را در 2 به مقدار x_position اضافه می‌کنیم:

1
2
3
Original x-position: 0

New x-position: 2

حذف کردن جفت‌های کلید-مقدار

زمانی که دیگر به اطّلاعاتِ ذخیره‌شده در دیکشنری نیاز نداشتید می‌توانید به کمک عبارت del، یک جفت کلید-مقدار را به کلّی حذف کنید:

1
2
3
4
5
6
7
alien_0 = {'color': 'green', 'points': 5}

print(alien_0)

del alien_0['points']

print(alien_0)

خروجی نشان می‌دهد که کلید ‘points’ و مقدار آن، ۵، از دیکشنری حذف شده:

1
2
3
{'color': 'green', 'points': 5}

{'color': 'green'}
نکته
توجّه داشته باشید که جفت کلید-مقدار به صورت همیشگی حذف خواهد شد.

3 - یک دیکشنری شامل اشیای مشابه

مثال قبلی به ذخیره‌سازی اطّلاعاتِ مختلفِ یک شیء می‌پرداخت که موجودی بیگانه‌ای در یک بازی بود. علاوه بر این حالت شما می‌توانید از دیکشنری برای ذخیره کردن یک نوع اطّلاعات در مورد اشیاء مختلف استفاده کنید. مثلاً فرض کنید می‌خواهید از افراد مختلف در مورد زبان برنامه‌نویسی موردعلاقه‌شان نظرسنجی کنید:

1
2
3
4
5
6
favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

هر کدام از کلیدها نام یکی از افراد پاسخ‌دهنده و هر مقدارْ زبان برنامه‌نویسی مورد علاقه‌ی اوست.

برای استفاده از این دیکشنری، با داشتن نام فرد شرکت‌کننده در نظرسنجی، زبان برنامه‌نویسی دلخواه او به سادگی به دست می‌آید:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

language = favorite_languages['sarah'].title()

print(f"Sarah's favorite language is {language}.")

خروجی زبان مورد علاقه‌ی سارا را نمایش می‌دهد:

1
Sarah's favorite language is C.

به‌کارگیری get() برای دسترسی به مقدارها

به‌کارگیری کلید‌ها در کروشه برای بازیابی مقدار مورد نظر از دیکشنری یک خطر بالقوّه دارد: اگر کلید درخواستی شما وجود نداشته باشد به خطا برمی‌خورید:

1
2
3
alien_0 = {'color': 'green', 'speed': 'slow'}

print(alien_0['points'])
1
2
3
4
Traceback (most recent call last):
  File "alien_no_points.py", line 2, in <module>
    print(alien_0['points'])
KeyError: 'points'

برای دیکشنری‌ها به طور خاص می‌توانید از متد get() استفاده کنید تا برای مواقعی که کلید درخواستی وجود ندارد مقدارِ پیش‌فرضی برای بازگرداندن تعیین کنید:

1
2
3
4
5
alien_0 = {'color': 'green', 'speed': 'slow'}

point_value = alien_0.get('points', 'No point value assigned.')

print(point_value)

اگر کلید ‘points’ در دیکشنری وجود نداشته باشد، مقدار متناظر آن برگردانده می‌شود. در غیر این صورت مقدار پیش‌فرض تعیین‌شده را خواهید گرفت:

1
No point value assigned.
نکته
اگر نشان‌وند دوم را هنگام فراخوانی get() تعیین نکنید و کلید مورد نظر وجود نداشته باشد، پایتون مقدار None را برمی‌گرداند. مقدار ویژه‌ی None به معنای «وجود نداشتنِ هیچ مقداری» است. این خطا نیست بلکه مقداری ویژه است که فقدان یک مقدار را مشخّص می‌کند.

خودآزمایی

فرد

از یک دیکشنری برای ذخیره‌سازی اطّلاعات مربوط به فردی استفاده کنید که او را می‌شناسید. نام و نام خانوادگی، سن و شهرِ محل زندگی او را ضبط کنید. باید کلیدهایی مانند first_name، last_name، age و city داشته باشید. هر بخشِ اطّلاعاتی را که ذخیره کرده‌اید چاپ کنید.

اعداد محبوب

از یک دیکشنری برای ذخیره کردن اعداد محبوبِ افراد استفاده کنید. پنج نام در نظر بگیرید و آن‌ها را به عنوان کلیدهای یک دیکشنری به کار بگیرید. اعدادی را به عنوان عدد محبوب هر فرد به جای مقدارهای هر کلید در دیکشنری ذخیره کنید. نام هر کس و عدد مورد علاقه‌ی او را چاپ کنید.

واژه‌نامه

دیکشنری پایتون می‌تواند به عنوان دیکشنری (واژه‌نامه‌ی) واقعی به کار رود.

  • پنج واژه‌ی مربوط به برنامه‌نویسی را در نظر بگیرید که در فصل‌های گذشته معنی آن‌ها را آموخته‌اید. از واژه‌ها به عنوان کلید و از معنی آن‌ها به جای مقدار استفاده کرده و آن‌ها را در دیکشنری ذخیره کنید.
  • هر واژه و معنای آن را به شکلی منظّم در خروجی چاپ کنید.

4 - حلقه زدن در یک دیکشنری

یک دیکشنری پایتون می‌تواند شامل تنها چند جفت کلید-مقدار یا میلیون‌ها عدد از آن‌ها باشد. چون دیکشنری قابلیّت ذخیره‌سازی انبوهی از اطّلاعات را دارد، پایتون این امکان را برای شما فراهم می‌آورد تا در یک دیکشنری حلقه بزنید. می‌توانید در تمام جفت‌های کلید-مقدار یک دیکشنری، در کلید‌ها و یا در مقدارهای آن حلقه بزنید.

حلقه زدن در تمام جفت‌های کلید-مقدار

دیکشنری زیر نام کاربری، نام و نام خانوادگی یک فرد را ذخیره می‌کند:

1
2
3
4
5
6
7
8
9
user_0 = {
    'username': 'efermi',
    'first': 'enrico',
    'last': 'fermi',
}

for key, value in user_0.items():
    print(f"\nKey: {key}")
    print(f"Value: {value}")

برای نوشتن یک حلقه‌ی for برای دیکشنری، دو متغیّر را نام‌گذاری می‌کنیم که کلید و مقدار یک جفت کلید-مقدار را نگهداری می‌کند. بخش دوم عبارت for در 1، نام دیکشنری را در بر می‌گیرد که متد items() پس از آن آمده است. این متد لیستی از جفت‌های کلید-مقدار برمی‌گرداند:

1
2
3
4
5
6
7
8
Key: last
Value: Fermi

Key: first
Value: enrico

Key: username
Value: efermi

برای مثال favorite_languages.py که در صفحه‌ی قبل دیدیم، اگر داخل دیکشنری favorite_languages حلقه بزنید نام هر فرد و زبان برنامه‌نویسی مورد علاقه‌ی او را به دست می‌آورید:

1
2
3
4
5
6
7
8
9
favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

for name, language in favorite_languages.items():
    print(f"{name.title()}'s favorite language is {language.title()}.")
1
2
3
4
5
6
7
Jen's favorite language is Python.

Sarah's favorite language is C.

Edward's favorite language is Ruby.

Phil's favorite language is Python.

حلقه زدن در تمام کلیدهای یک دیکشنری

در صورتی که مقدارهای یک دیکشنری مورد نظر نباشد، استفاده از متد keys() سودمند است:

1
2
3
4
5
6
7
8
9
favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

for name in favorite_languages.keys():
    print(name.title())
1
2
3
4
5
6
7
Jen

Sarah

Edward

Phil

در واقع هنگام حلقه زدن در یک دیکشنری، رفتار پیش‌فرض همان حلقه زدن در کلیدها است، پس اگر به جای for name in favorite_languages.keys(): این کد را می‌نوشتید: for name in favorite_languages: نتیجه یکسان می‌شد.

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

friends = ['phil', 'sarah']

for name in favorite_languages.keys():
    print(name.title())

    if name in friends:
        language = favorite_languages[name].title()
        print(f"\t{name.title()}, I see you love {language}!")
1
2
3
4
5
6
7
8
9
Hi Jen.

Hi Sarah.
    Sarah, I see you love C!

Hi Edward.

Hi Phil.
    Phil, I see you love Python!

همچنین برای این که بفهمید فردی در نظرسنجی شرکت کرده یا نه، می‌توانید از متد keys() استفاده کنید:

1
2
if 'erin' not in favorite_languages.keys():
    print("Erin, please take our poll!")
1
Erin, please take our poll!

حلقه زدن در کلید‌های دیکشنری با یک ترتیب خاص

از پایتون ۳.۷ به بعد حلقه زدن در دیکشنری اعضای آن را به همان ترتیبِ ذخیره شدن باز می‌گرداند. با این حال گاهی به حلقه زدن در دیکشنری با ترتیبی متفاوت نیاز دارید:

1
2
3
4
5
6
7
8
9
favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

for name in sorted(favorite_languages.keys()):
    print(f"{name.title()}, thank you for taking the poll.")
1
2
3
4
5
6
7
Edward, thank you for taking the poll.

Jen, thank you for taking the poll.

Phil, thank you for taking the poll.

Sarah, thank you for taking the poll.

حلقه زدن در تمام مقدارهای یک دیکشنری

اگر بررسی مقدارهای یک دیکشنری برای شما اولویّت بیشتری دارد، می‌توانید از متد values() استفاده کنید:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

print("The following languages have been mentioned:")

for language in favorite_languages.values():
    print(language.title())
1
2
3
4
5
6
7
8
9
The following languages have been mentioned:

Python

C

Python

Ruby

این رویکرد تمام مقدارهای دیکشنری را بیرون می‌کشد بدون این که به تکراری بودن یا نبودن آن‌ها اهمّیّتی دهد. برای این که زبان‌های برنامه‌نویسی انتخابی را بدون تکرار ببینیم، از مجموعه استفاده می‌کنیم:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

print("The following languages have been mentioned:")

for language in set(favorite_languages.values()):
    print(language.title())
1
2
3
4
5
6
7
The following languages have been mentioned:

Python

C

Ruby
نکته

برای ساختن مستقیم یک مجموعه می‌توانید از آکُلاد استفاده کرده و اعضا را با کاما از هم جدا کنید:

1
2
3
>>> languages = {'python', 'ruby', 'python', 'c'}
>>> languages
{'ruby', 'python', 'c'}

اشتباه گرفتن مجموعه و دیکشنری به سادگی امکان‌پذیر است زیرا هر دو در آکُلاد قرار می‌گیرند. اگر به آکُلادهایی برخوردید که درون آن جفت‌های کلید-مقدار نبود، احتمالاً با یک مجموعه سر و کار دارید.

خودآزمایی

واژه‌نامه ۲

حال که حلقه زدن در دیکشنری را آموخته‌اید، کد تمرین ۶-۳ را تمیز کنید به طوری که به جای تعدادی print() از یک حلقه برای نمایش کلید‌ها و مقدارهای دیکشنری استفاده شود. پنج عبارت پایتونی دیگر به واژه‌نامه‌ی خود بیفزایید.

رودخانه‌ها

یک دیکشنری بسازید که شامل سه رودخانه‌ی اصلی و کشوری که آن رودخانه‌ها در آن جریان دارند، باشد.

  • از یک حلقه برای چاپ کردن جمله‌ای در مورد رودخانه استفاده کنید، مثلاً: The Nile runs through Egypt.
  • از حلقه‌ای برای چاپ نام تک‌تکِ رودخانه‌های داخل دیکشنری استفاده کنید.
  • از حلقه‌ای برای چاپ نام تک‌تکِ کشورهای داخل دیکشنری استفاده کنید.

نظرسنجی

از کد favorite_languages.py استفاده کنید.

  • لیستی از افرادی که باید در نظرسنجی شرکت کنند، تهیه کنید که شامل چند نام موجود در دیکشنری و چند نام جدید باشد.
  • در لیست افرادی که باید شرکت کنند حلقه بزنید. اگر پیش از این در نظرسنجی شرکت کرده بودند، پیام تشکری خطاب به آن‌ها چاپ کنید. اگر نه پیامی چاپ کنید و از آن‌ها برای شرکت در نظرسنجی دعوت به عمل آورید.

5 - تودرتوکردن

گاهی می‌خواهید چند دیکشنری را درون یک لیست یا لیستی از موارد را به عنوان مقدار در یک دیکشنری قرار دهیم. به این کار تودرتو کردن می‌گویند. می‌توانید دیکشنری‌ها را داخل یک لیست، لیستی را داخل یک دیکشنری و حتّی یک دیکشنری را داخل یک دیکشنری دیگر قرار دهید.

لیستی از دیکشنری‌ها

دیکشنری alien_0 شامل اطّلاعات مختلفی از یک موجود بیگانه است امّا دیگر برای ذخیره کردنِ اطّلاعاتِ موجودِ بیگانه‌ی دوم جا ندارد. یک راه ساختن لیستی از دیکشنری‌هاست:

1
2
3
4
5
6
7
8
alien_0 = {'color': 'green', 'points': 5}
alien_1 = {'color': 'yellow', 'points': 10}
alien_2 = {'color': 'red', 'points': 15}

aliens = [alien_0, alien_1, alien_2]

for alien in aliens:
    print(alien)
1
2
3
4
5
{'color': 'green', 'points': 5}

{'color': 'yellow', 'points': 10}

{'color': 'red', 'points': 15}

یک مثال واقعی‌تر ساختن بیشتر از سه موجود به کمک کدی است که تولید موجودات بیگانه را به طور خودکار انجام می‌دهد. در مثال زیر از range() برای ساختن ناوگانی از ۳۰ موجود بیگانه استفاده می‌کنیم:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# Make an empty list for storing aliens.
aliens = []

# Make 30 green aliens.
for alien_number in range(30):
    new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
    aliens.append(new_alien)

# Show the first 5 aliens.
for alien in aliens[:5]:
    print(alien)

print("...")

# Show how many aliens have been created.
print(f"Total number of aliens: {len(aliens)}")
1
2
3
4
5
6
7
8
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
...

Total number of aliens: 30

این موجودهای بیگانه همگی خصوصیّاتی مشترک دارند ولی پایتون هر کدام از آن‌ها را یک شیء جدا در نظر می‌گیرد که امکان تغییر دادن جداگانه‌ی هر کدام از آن‌ها در آینده فراهم است.

چگونه می‌توانید با چنین گروهی از موجودات بیگانه کار کنید؟ تصوّر کنید که بخشی از بازی موجوداتی دارد که رنگ آن‌ها عوض می‌شود:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
aliens = []

for alien_number in range(30):
    new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
    aliens.append(new_alien)

for alien in aliens[:3]:
    if alien['color'] == 'green':
        alien['color'] = 'yellow'
        alien['speed'] = 'medium'
        alien['points'] = 10

# Show the first 5 aliens.
for alien in aliens[:5]:
    print(alien)

print("...")
1
2
3
4
5
6
{'speed': 'medium', 'color': 'yellow', 'points': 10}
{'speed': 'medium', 'color': 'yellow', 'points': 10}
{'speed': 'medium', 'color': 'yellow', 'points': 10}
{'speed': 'slow', 'color': 'green', 'points': 5}
{'speed': 'slow', 'color': 'green', 'points': 5}
...

این حلقه را می‌توان با افزودن یک بخش elif گسترش داد تا موجودهای زردرنگ را قرمزرنگ، سریع و ۱۵ امتیازی کند:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
for alien in aliens[0:3]:
    if alien['color'] == 'green':
        alien['color'] = 'yellow'
        alien['speed'] = 'medium'
        alien['points'] = 10

    elif alien['color'] == 'yellow':
        alien['color'] = 'red'
        alien['speed'] = 'fast'
        alien['points'] = 15

لیستی در یک دیکشنری

گاهی سودمند است که به جای قرار دادن یک دیکشنری درونِ یک لیست، لیستی را درون یک دیکشنری بگذاریم. برای نمونه به این فکر کنید که چگونه می‌توان پیتزایی را توصیف کرد که یک نفر سفارش می‌دهد:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Store information about a pizza being ordered.
pizza = {
    'crust': 'thick',
    'toppings': ['mushrooms', 'extra cheese'],
}

# Summarize the order.
print(f"You ordered a {pizza['crust']}-crust pizza "
      "with the following toppings:")

for topping in pizza['toppings']:
    print("\t" + topping)
1
2
3
You ordered a thick-crust pizza with the following toppings:
	mushrooms
	extra cheese

هر گاه به این نیاز داشتید که در یک دیکشنری بیش از یک مقدار را به یک کلید نسبت دهید، می‌توانید لیست را در دیکشنری به کار ببرید:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
favorite_languages = {
    'jen': ['python', 'ruby'],
    'sarah': ['c'],
    'edward': ['ruby', 'go'],
    'phil': ['python', 'haskell'],
}

for name, languages in favorite_languages.items():
    print(f"\n{name.title()}'s favorite languages are:")

    for language in languages:
        print(f"\t{language.title()}")
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Jen's favorite languages are:
	Python
	Ruby

Sarah's favorite languages are:
	C

Phil's favorite languages are:
	Python
	Haskell

Edward's favorite languages are:
	Ruby
	Go
نکته
نباید بیش از اندازه لیست‌ها و دیکشنری‌ها را در هم به کار ببرید. اگر بیش از آن‌که در مثال‌های این فصل دیدید، نیاز به داخل کردن این موارد در یکدیگر پیدا کردید، احتمالاً راه حل ساده‌تری برای حل آن مساله وجود دارد.

یک دیکشنری در یک دیکشنری دیگر

امکان قرار دادن یک دیکشنری درون یک دیکشنری دیگر وجود دارد:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
users = {
    'aeinstein': {
        'first': 'albert',
        'last': 'einstein',
        'location': 'princeton',
    },

    'mcurie': {
        'first': 'marie',
        'last': 'curie',
        'location': 'paris',
    },
}

for username, user_info in users.items():
    print(f"\nUsername: {username}")
    full_name = f"{user_info['first']} {user_info['last']}"
    location = user_info['location']
    print(f"\tFull name: {full_name.title()}")
    print(f"\tLocation: {location.title()}")
1
2
3
4
5
6
7
Username: aeinstein
	Full name: Albert Einstein
	Location: Princeton

Username: mcurie
	Full name: Marie Curie
	Location: Paris
نکته
توجّه کنید که ساختار دیکشنری هر کاربر یکسان است. هر چند چنین چیزی در پایتون اجباری نیست، امّا این ساختار یکسان تودرتو کردن دیکشنری‌ها را ساده‌تر می‌کند.

خودآزمایی

مردم

از برنامه‌ای شروع کنید که در تمرین ۶-۱ نوشتید. دو دیکشنری جدید در مورد افراد مختلف بسازید و هر سه دیکشنری را در لیستی به نام people ذخیره کنید. در لیست حلقه بزنید و حین این کار، هر چه در مورد هر فرد می‌دانید چاپ کنید.

حیوانات خانگی

چند دیکشنری بسازید که هر کدام بیانگر یک حیوان خانگی باشد. در هر دیکشنری نوع حیوان و نام صاحب آن را بیاورید. این دیکشنری‌ها را در لیستی به نام pets ذخیره کنید. سپس در لیست حلقه بزنید و همزمان هر چه در مورد هر کدام از حیوان‌ها می‌دانید چاپ کنید.

مکان‌های مورد علاقه

یک دیکشنری به نام favorite_places بسازید. نام سه نفر را به عنوان کلیدهای این دیکشنری و نام سه مکان دلخواه را برای هر کس به عنوان مقدار این کلیدها ذخیره کنید. در دیکشنری حلقه بزنید و نام و مکان مورد علاقه‌ی هر کس را چاپ کنید.

نام‌های مورد علاقه

برنامه‌ی تمرین ۶-۲ را تغییر دهید به طوری‌که هر فرد بتواند بیش از یک عدد دلخواه داشته باشد. سپس نام هر فرد و اعداد مورد علاقه‌ی او را چاپ کنید.

شهرها

یک دیکشنری به نام cities بسازید. نام سه شهر را به عنوان کلید‌های آن در نظر بگیرید. برای اطّلاعات هر شهر یک دیکشنری بسازید که شامل این موارد باشد: کشوری که آن شهر در آن است، جمعیّت تقریبی و یک دانستنی در مورد آن.

توسعه‌ها

از یکی از برنامه‌های نمونه‌ی این فصل استفاده کنید و با افزودن کلیدها و مقدارها، تغییر بستر و مفهوم برنامه و بهبود شکل خروجی، آن را توسعه دهید.

6 - خلاصه

در این فصل روش تعریف کردن یک دیکشنری و نحوه‌ی کار کردن با اطّلاعات ذخیره شده در آن را آموختید. یاد گرفتید که چگونه به اعضای دیکشنری به طور جداگانه دسترسی پیدا کنید، آن‌ها را تغییر دهید و این که چگونه در تمام اطّلاعات یک دیکشنری حلقه بزنید. حلقه زدن در جفت‌های کلید-مقدار، کلید‌ها و مقدارهای یک دیکشنری را آموختید. همچنین یاد گرفتید که چگونه چند دیکشنری را درون یک لیست، لیست‌ها را درون یک دیکشنری و دیکشنری را درون یک دیکشنری دیگر قرار دهید.

در فصل بعد درباره‌ی حلقه‌های while و نحوه‌ی دریافت اطّلاعات از کاربرانی که با برنامه‌ی شما کار می‌کنند، خواهید آموخت. این فصل بسیار مهیّج خواهد بود زیرا می‌آموزید که تمام برنامه‌های خود را تعاملی کنید: همه‌ی آن‌ها قادر خواهند بود که به ورودی کاربر پاسخ دهند.