مقدمه

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

پیمایش روی کلیدهای دیکشنری

اگر یک دیکشنری را با حلقه‌ای مثل for پیمایش کنیم، این کلیدهای دیکشنری هستند که پیمایش می‌شوند. برای روشن شدن این موضوع، به مثال زیر نگاه کنید.

Copy Icon looping_dictionaries.py
user_1 = {'username': 'alice', 'age': 26, 'is_active': False}

for key in user_1: 
  print(key)

اجرای این کد، با نتیجه‌ی زیر همراه است.

username 
age 
is_active 
          

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

Copy Icon looping_dictionaries.py
user_1 = {'username': 'alice', 'age': 26, 'is_active': False}

for key in user_1.keys(): 
  print(key)

پیمایش روی مقادیر دیکشنری

اگر بخواهیم به جای کلیدها، روی مقادیر موجود در یک دیکشنری پیمایش کنیم، باید از متدی به نام values() استفاده کنیم. در مثال زیر، از این متد استفاده کرده‌ایم.

Copy Icon looping_dictionaries.py
user_1 = {'username': 'alice', 'age': 26, 'is_active': False}

for key in user_1.values(): 
  print(key)

اگر این کد را اجرا کنید، نتیجه‌ی زیر را دریافت خواهید کرد.

alice 
26 
False
          

پیمایش روی جفت‌های کلید و مقدار

امکان پیمایش روی جفت‌های کلید و مقدار هم وجود دارد. برای این کار، باید از متد items() استفاده کنیم و البته در ساختار حلقه هم باید دو نام متغیر تعیین کنیم که اولی به کلیدها و دومی به مقادیر اشاره می‌کند.

Copy Icon looping_dictionaries.py
user_1 = {'username': 'alice', 'age': 26, 'is_active': False}

for key, value in user_1.items(): 
  print(f"{key} is {value}")

خروجی کد بالا به صورت زیر است.

username is alice 
age is 26 
is_active is False
          

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

Copy Icon looping_dictionaries.py
user_1 = {'username': 'alice', 'age': 26, 'is_active': False}

for key in user_1: 
  print(f"{key} is {user_1[key]}")

تا اینجا در ساختار حلقه، از نام‌های key و value برای متغیرهای حلقه استفاده کردیم. اما گاهی بهتر است از نام‌های بامعناتری استفاده کنیم. به مثال زیر توجه کنید.

Copy Icon looping_dictionaries.py
favorite_languages = {
  'jen': 'python',
  'sarah': 'c',
  'edward': 'rust',
  'phil': 'python',
  }
             
  for name, language in favorite_languages.items():
    print(f"{name.title()}'s favorite language is {language.title()}.")

نتیجه‌ی اجرای این کد، به صورت یر خواهد بود.

Jen's favorite language is Python.
Sarah's favorite language is C.
Edward's favorite language is Rust.
Phil's favorite language is Python.
          

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

همانطور که قبلاً هم گفتیم، در جفت‌های کلید و مقدار یک دیکشنری، مقدار می‌تواند از هر نوعی باشد. از جمله اینکه این مقدار می‌تواند خود یک دیکشنری باشد. در این حالت، ما با دیکشنری‌های تودرتو (nesting ditionaries) مواجه هستیم. پیمایش روی دیکشنری‌های تودرتو به حلقه‌های تودرتو نیاز دارد. مثال زیر را ببینید.

Copy Icon looping_dictionaries.py
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()}")

نتیجه‌ی اجرای کد بالا به صورت زیر خواهد بود.

Username: aeinstein
        Full name: Albert Einstein
        Location: Princeton

Username: mcurie
        Full name: Marie Curie
        Location: Paris
          

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