استفاده از zip و enumerate در پایتون: مفاهیم متوسط

استفاده از zip و enumerate در پایتون: مفاهیم متوسط

در پایتون، توابع zip و enumerate ابزارهای قدرتمندی هستند که به شما امکان می‌دهند به طور موثر با چندین لیست یا iterable به طور همزمان کار کنید و همچنین به راحتی به اندیس عناصر در حین تکرار دسترسی پیدا کنید. این توابع اغلب در کدهای پایتون برای ساده‌سازی فرآیندها و افزایش خوانایی استفاده می‌شوند. این مقاله به بررسی عمیق این دو تابع، نحوه عملکرد آن‌ها، کاربردهای مختلف و نکات مهم در استفاده از آن‌ها می‌پردازد.

تابع zip: ترکیب چند iterable

تابع zip یک یا چند iterable (مانند لیست، تاپل، رشته و غیره) را به عنوان ورودی می‌گیرد و یک iterator برمی‌گرداند که عناصر مربوطه از هر iterable را به صورت جفت (tuple) تولید می‌کند. به عبارت دیگر، zip عناصر با اندیس یکسان از هر iterable را با هم ترکیب می‌کند.

نحوه عملکرد zip

فرض کنید دو لیست داریم:

names = ["علی", "رضا", "محمد"]
ages = [25, 30, 28]

اگر از zip برای ترکیب این دو لیست استفاده کنیم، نتیجه به صورت زیر خواهد بود:

zipped = zip(names, ages)
print(list(zipped))  # خروجی: [('علی', 25), ('رضا', 30), ('محمد', 28)]

همانطور که می‌بینید، zip یک لیست از تاپل‌ها را برگردانده است که هر تاپل شامل نام و سن مربوطه است.

طول iterable ها

اگر طول iterable ها با هم متفاوت باشد، zip تا زمانی که کوتاه‌ترین iterable به پایان برسد، عناصر را ترکیب می‌کند. عناصر باقی‌مانده در iterable های طولانی‌تر نادیده گرفته می‌شوند.

names = ["علی", "رضا", "محمد", "حسن"]
ages = [25, 30, 28]

zipped = zip(names, ages)
print(list(zipped))  # خروجی: [('علی', 25), ('رضا', 30), ('محمد', 28)]

در این مثال، “حسن” از لیست names نادیده گرفته شد زیرا لیست ages فقط سه عنصر داشت.

Unzipping با استفاده از *

می‌توانید از عملگر * برای “unzip” کردن یک iterable که توسط zip ایجاد شده است استفاده کنید. این کار به شما امکان می‌دهد iterable های اصلی را بازیابی کنید.

names = ["علی", "رضا", "محمد"]
ages = [25, 30, 28]

zipped = zip(names, ages)
unzipped_names, unzipped_ages = zip(*zipped)

print(list(unzipped_names))  # خروجی: ['علی', 'رضا', 'محمد']
print(list(unzipped_ages))  # خروجی: [25, 30, 28]

کاربردهای zip

  • ایجاد دیکشنری: می‌توانید از zip برای ایجاد یک دیکشنری از دو لیست استفاده کنید.
  • تکرار موازی: می‌توانید از zip برای تکرار همزمان روی چندین لیست استفاده کنید و عملیات مشابه را روی عناصر مربوطه انجام دهید.
  • مقایسه لیست‌ها: می‌توانید از zip برای مقایسه عناصر دو لیست استفاده کنید.

تابع enumerate: دسترسی به اندیس و مقدار

تابع enumerate یک iterable را به عنوان ورودی می‌گیرد و یک iterator برمی‌گرداند که جفت‌های (اندیس، مقدار) را تولید می‌کند. این تابع به شما امکان می‌دهد به راحتی به اندیس هر عنصر در حین تکرار دسترسی پیدا کنید.

نحوه عملکرد enumerate

فرض کنید یک لیست داریم:

fruits = ["سیب", "موز", "پرتقال"]

اگر از enumerate برای تکرار این لیست استفاده کنیم، نتیجه به صورت زیر خواهد بود:

for index, fruit in enumerate(fruits):
  print(f"اندیس: {index}, میوه: {fruit}")

خروجی:

اندیس: 0, میوه: سیب
اندیس: 1, میوه: موز
اندیس: 2, میوه: پرتقال

شروع شمارش از یک عدد دیگر

به طور پیش‌فرض، enumerate شمارش را از 0 شروع می‌کند. با این حال، می‌توانید با استفاده از آرگومان دوم enumerate، شمارش را از یک عدد دیگر شروع کنید.

fruits = ["سیب", "موز", "پرتقال"]

for index, fruit in enumerate(fruits, 1):
  print(f"اندیس: {index}, میوه: {fruit}")

خروجی:

اندیس: 1, میوه: سیب
اندیس: 2, میوه: موز
اندیس: 3, میوه: پرتقال

کاربردهای enumerate

  • دسترسی به اندیس در حین تکرار: اصلی‌ترین کاربرد enumerate، دسترسی به اندیس هر عنصر در حین تکرار است.
  • ایجاد لیست‌های شماره‌گذاری شده: می‌توانید از enumerate برای ایجاد لیست‌های شماره‌گذاری شده استفاده کنید.
  • جستجو در لیست‌ها: می‌توانید از enumerate برای جستجو در لیست‌ها و یافتن اندیس یک عنصر خاص استفاده کنید.

ترکیب zip و enumerate

می‌توانید از zip و enumerate به طور همزمان برای انجام عملیات پیچیده‌تر استفاده کنید. به عنوان مثال، می‌توانید از zip برای ترکیب چندین لیست استفاده کنید و سپس از enumerate برای تکرار روی لیست ترکیب شده و دسترسی به اندیس و مقادیر مربوطه استفاده کنید.

names = ["علی", "رضا", "محمد"]
ages = [25, 30, 28]
cities = ["تهران", "اصفهان", "شیراز"]

for index, (name, age, city) in enumerate(zip(names, ages, cities)):
  print(f"ردیف: {index + 1}, نام: {name}, سن: {age}, شهر: {city}")

خروجی:

ردیف: 1, نام: علی, سن: 25, شهر: تهران
ردیف: 2, نام: رضا, سن: 30, شهر: اصفهان
ردیف: 3, نام: محمد, سن: 28, شهر: شیراز

نکات مهم در استفاده از zip و enumerate

  • درک طول iterable ها: هنگام استفاده از zip، به طول iterable ها توجه کنید تا از از دست رفتن عناصر جلوگیری کنید.
  • استفاده از iterator ها: zip و enumerate iterator برمی‌گردانند. برای استفاده مجدد از مقادیر، باید آن‌ها را به یک لیست یا ساختار داده دیگر تبدیل کنید.
  • خوانایی کد: از zip و enumerate برای ساده‌سازی کد و افزایش خوانایی آن استفاده کنید.

نتیجه‌گیری

توابع zip و enumerate ابزارهای بسیار مفیدی در پایتون هستند که به شما امکان می‌دهند به طور موثر با چندین iterable به طور همزمان کار کنید و به راحتی به اندیس عناصر در حین تکرار دسترسی پیدا کنید. با درک نحوه عملکرد این توابع و کاربردهای مختلف آن‌ها، می‌توانید کدهای پایتون خود را ساده‌تر، خواناتر و کارآمدتر کنید.

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *