تودرتوکردن

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

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

دیکشنری 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 بسازید. نام سه شهر را به عنوان کلید‌های آن در نظر بگیرید. برای اطّلاعات هر شهر یک دیکشنری بسازید که شامل این موارد باشد: کشوری که آن شهر در آن است، جمعیّت تقریبی و یک دانستنی در مورد آن.

توسعه‌ها

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