جلسه بیشت و یکم

ساختمان داده های تودرتو

در پایتون، “nesting” به معنی قرار دادن یک ساختار داده درون ساختار داده دیگر است. به عبارت دیگر، nesting در پایتون به ایجاد ساختارهای داده درون-تودرتو اشاره دارد.

در پایتون، انواع مختلفی از ساختارهای داده قابل nesting هستند، از جمله:

1. **لیست درون-لیست (List within List):**

– در این حالت، هر عنصر از یک لیست می‌تواند خود یک لیست باشد.

– مثال:

				
					my_list = [
           [15 , 20 , 18], 
           [17 , 20 , 20], 
           [12 , 16 , 15], 
           [20 , 20 , 20]
           ]
j = 1
for i in my_list:
  print(f'nomarat nafar{j} = {i}')
  j += 1
				
			

این کد یک لیست دو‌بعدی به نام `my_list` تعریف می‌کند که هر عنصر آن یک لیست دیگر است.سپس، از یک حلقه `for` استفاده می‌کند که در هر تکرار، یکی از زیر‌لیست‌های `my_list` را به متغیر `i` اختصاص می‌دهد.در هر تکرار، کد یک رشته فرمت شده چاپ می‌کند که در آن شماره نفر و محتوای لیست آن نفر نمایش داده می‌شود.همچنین، متغیر `j` به عنوان شمارنده نفرات افزایش پیدا می‌کند.

2. **دیکشنری درون-دیکشنری (Dictionary within Dictionary):**

– در این حالت، هر کلید یا مقدار در یک دیکشنری می‌تواند خود یک دیکشنری باشد.

– مثال:

				
					users = {
  'aeinstein': {
    'first': 'albert',
    'last': 'einstein',
    'location': 'princeton',
  },
  'mcurie': {
    'first': 'marie',
    'last': 'curie',
    'location': 'paris',
  },
}
for username, user_dict in users.items():
  print("nUsername: " + username)
full_name = user_dict['first'] + " "
full_name += user_dict['last']
location = user_dict['location']
print("tFull name: " + full_name.title())
print("tLocation: " + location.title())
				
			

این کد یک ساختار داده‌ای به شکل دیکشنری به نام `users` دارد که در آن هر کلید (نام کاربری) به یک دیکشنری دیگر اشاره دارد که حاوی اطلاعات مربوط به آن کاربر است.سپس، کد از یک حلقه `for` استفاده می‌کند که در هر تکرار، یک کلید-مقدار زوج از دیکشنری `users` را به متغیرهای `username` و `user_dict` اختصاص می‌دهد.در داخل این حلقه، کد ابتدا نام کاربری را چاپ می‌کند. سپس، از اطلاعات موجود در `user_dict` برای ساخت نام کامل کاربر و چاپ آن استفاده می‌کند. همچنین، محل اقامت کاربر را از `user_dict` می‌خواند و آن را چاپ می‌کند.

3. **لیست درون-دیکشنری (List within Dictionary):**

– در این حالت، مقدار هر کلید در یک دیکشنری می‌تواند یک لیست باشد.

– مثال:

				
					# Store multiple languages for each person.
fav_languages = {
    'jen': ['python', 'ruby'],
    'sarah': ['c'],
    'edward': ['ruby', 'go']
}
# Show all responses for each person.
for name, langs in fav_languages.items():
  print(name + ": ")
  for lang in langs:
    print("- " + lang)
				
			

این کد یک ساختار داده‌ای به شکل دیکشنری به نام `fav_languages` دارد که در آن هر کلید (نام) به لیستی از زبان‌های مورد علاقه آن فرد اشاره دارد.سپس، کد از یک حلقه `for` استفاده می‌کند که در هر تکرار، یک کلید-مقدار زوج از دیکشنری را به متغیرهای `name` و `langs` اختصاص می‌دهد.در داخل این حلقه، کد ابتدا نام فرد را چاپ می‌کند، و سپس از یک حلقه `for` دیگر استفاده می‌کند که در هر تکرار، یک زبان از لیست `langs` را به متغیر `lang` اختصاص می‌دهد و آن را با علامت “-” چاپ می‌کند.

4. **دیکشنری درون-لیست (Dictionary within List):**

– در این حالت، هر عنصر در یک لیست می‌تواند خود یک دیکشنری باشد.

– مثال:

				
					# Define a list of users, where each user
# is represented by a dictionary.
users = [
  {
    'last': 'fermi',
    'first': 'enrico',
    'username': 'efermi',
  },
  {
    'last': 'curie',
    'first': 'marie',
    'username': 'mcurie',
  },
]
# Show all information about each user.
for user_dict in users:
  for k, v in user_dict.items():
    print(k + ": " + v)
print("n")
				
			

این کد یک ساختار داده‌ای را نمایش می‌دهد که شامل یک لیست از دیکشنری‌هاست. هر دیکشنری در این لیست نمایانگر یک کاربر و یک عنصر از لیست است و دارای سه کلید است: ‘last’، ‘first’ و ‘username’.برای نمایش اطلاعات هر کاربر، کد از دو حلقه `for` استفاده می‌کند:1 . حلقه بیرونی for user_dict in users: که هر دیکشنری در لیست `users` را به متغیر `user_dict` اختصاص می‌دهد. 2 . حلقه درونی for k, v in user_dict.items(): که هر کلید-مقدار زوج در هر دیکشنری را به متغیرهای `k` و `v` اختصاص می‌دهد. سپس، کد هر کلید و مقدار را با استفاده از `print()` چاپ می‌کند و در پایان یک خط خالی چاپ می‌کند تا خروجی هر کاربر را از بقیه جدا کند.

به تعداد ساختمان داده استفاده شده می توان حلقه استفاده کرد.

Nesting در پایتون به شما این امکان را می‌دهد که ساختارهای داده پیچیده‌تری را ایجاد کنید و اطلاعات را به شکل منظم و سازمان‌یافته‌تری ذخیره و مدیریت کنید. این ویژگی به ویژه در کار با داده‌های پیچیده و ساختارمند مانند JSON یا XML بسیار کاربردی است.

مثال :

				
					from collections import OrderedDict
# Store each person's languages, keeping
# track of who respoded first.
fav_languages = OrderedDict()
fav_languages['jen'] = ['python', 'ruby']
fav_languages['sarah'] = ['c']
fav_languages['edward'] = ['ruby', 'go']
fav_languages['phil'] = ['python', 'haskell']
# Display the results, in the same order they
# were entered.
for name, langs in fav_languages.items():
  print(name + ":")
  for lang in langs:
    print("- " + lang)
				
			

مثال :

				
					aliens = []
# Make a million green aliens, worth 5 points
# each. Have them all start in one row.
for alien_num in range(1000000):
  new_alien = {}
  new_alien['color'] = 'green'
  new_alien['points'] = 5
  new_alien['x'] = 20 * alien_num
  new_alien['y'] = 0
  aliens.append(new_alien)
# Prove the list contains a million aliens.
num_aliens = len(aliens)
print("Number of aliens created:")
print(num_aliens)