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

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

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

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

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 استفاده کنید.

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