map و filter در پایتون چیست؟

در پایتون توابعی وجود دارند که به ما کمک می‌کنند روی مجموعه‌ای از داده‌ها عملیات انجام دهیم یا فقط داده‌های موردنظرمان را انتخاب کنیم. دو مورد مهم از این توابع، map() و filter() هستند.

در این آموزش یاد می‌گیریم که map و filter چگونه کار می‌کنند و چطور می‌توانیم آن‌ها را در کنار lambda استفاده کنیم.

تابع map در پایتون چیست؟

تابع map() یک تابع را روی تمام عناصر یک مجموعه مانند لیست اجرا می‌کند و نتیجه را برمی‌گرداند.

به زبان ساده، اگر بخواهیم یک عملیات مشخص را روی تمام اعضای یک لیست انجام دهیم، map می‌تواند کار ما را ساده‌تر کند.

ساختار map

map(function, iterable)

پارامتر اول تابعی است که باید روی عناصر اجرا شود و پارامتر دوم مجموعه‌ای مانند list یا tuple است.

یک مثال ساده از map

فرض کنید لیستی از اعداد داریم و می‌خواهیم همه آن‌ها را دو برابر کنیم.

numbers = [1, 2, 3, 4, 5] result = map(lambda x: x * 2, numbers) print(list(result))
[2, 4, 6, 8, 10]
نکته: تابع map در پایتون یک map object برمی‌گرداند. برای مشاهده نتیجه به صورت لیست می‌توانیم از list() استفاده کنیم.

استفاده از map با یک تابع معمولی

الزاماً لازم نیست از lambda استفاده کنیم. می‌توانیم یک تابع معمولی تعریف کنیم و آن را به map بدهیم.

def square(x): return x ** 2 numbers = [1, 2, 3, 4] result = map(square, numbers) print(list(result))
[1, 4, 9, 16]

استفاده از map برای تبدیل داده‌ها

یکی از کاربردهای مهم map تبدیل داده‌ها است. برای مثال می‌توانیم چند رشته را به عدد صحیح تبدیل کنیم.

numbers = ["10", "20", "30", "40"] result = map(int, numbers) print(list(result))
[10, 20, 30, 40]

تابع filter در پایتون چیست؟

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

ساختار filter

filter(function, iterable)

تابعی که به filter می‌دهیم باید برای هر عنصر یک نتیجه True یا False تولید کند.

یک مثال ساده از filter

فرض کنید می‌خواهیم فقط اعداد بزرگ‌تر از 10 را از یک لیست انتخاب کنیم.

numbers = [5, 12, 8, 20, 3, 15] result = filter(lambda x: x > 10, numbers) print(list(result))
[12, 20, 15]

filter با تابع معمولی

مانند map، در filter نیز می‌توانیم از یک تابع معمولی استفاده کنیم.

def is_even(x): return x % 2 == 0 numbers = [1, 2, 3, 4, 5, 6] result = filter(is_even, numbers) print(list(result))
[2, 4, 6]

تفاوت map و filter چیست؟

map: روی عناصر عملیات انجام می‌دهد و معمولاً مقدار جدید تولید می‌کند.

filter: عناصر را بر اساس یک شرط انتخاب می‌کند.

برای مثال:

numbers = [1, 2, 3, 4, 5] # map double = map(lambda x: x * 2, numbers) # filter even = filter(lambda x: x % 2 == 0, numbers)

نتیجه map شامل مقادیر تغییر داده‌شده است، در حالی که filter فقط عناصر موردنظر را نگه می‌دارد.

ترکیب map و filter

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

فرض کنید ابتدا می‌خواهیم فقط اعداد زوج را انتخاب کنیم و سپس آن‌ها را دو برابر کنیم.

numbers = [1, 2, 3, 4, 5, 6] even_numbers = filter(lambda x: x % 2 == 0, numbers) result = map(lambda x: x * 2, even_numbers) print(list(result))
[4, 8, 12]

ابتدا اعداد زوج انتخاب شدند:

[2, 4, 6]

سپس هر کدام دو برابر شدند:

[4, 8, 12]

مثال کاربردی: فیلتر کردن قیمت‌ها

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

prices = [80, 120, 250, 90, 180, 60] expensive = filter(lambda price: price > 100, prices) print(list(expensive))
[120, 250, 180]

مثال کاربردی با map و filter

حالا فرض کنیم ابتدا قیمت‌های بیشتر از 100 را انتخاب کنیم و سپس 10 درصد به آن‌ها اضافه کنیم.

prices = [80, 120, 250, 90, 180, 60] expensive = filter(lambda price: price > 100, prices) new_prices = map(lambda price: price * 1.10, expensive) result = [round(price, 2) for price in new_prices] print(result)
[132.0, 275.0, 198.0]
در این مثال ابتدا با filter قیمت‌های بیشتر از 100 انتخاب شدند و سپس با map مقدار جدید قیمت‌ها محاسبه شد.

map و filter روی رشته‌ها

این توابع فقط برای اعداد نیستند و می‌توانیم روی رشته‌ها نیز از آن‌ها استفاده کنیم.

مثال map با رشته‌ها

names = ["ali", "reza", "sara"] result = map(str.upper, names) print(list(result))
['ALI', 'REZA', 'SARA']

مثال filter با رشته‌ها

names = ["Ali", "Reza", "Sara", "Mohammad"] result = filter(lambda name: len(name) > 4, names) print(list(result))
['Mohammad']

map و filter چه زمانی مفید هستند؟

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

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

تفاوت map، filter و List Comprehension

در پایتون برای انجام بسیاری از این کارها می‌توانیم از List Comprehension نیز استفاده کنیم.

numbers = [1, 2, 3, 4, 5] result = [x * 2 for x in numbers]

در بسیاری از پروژه‌ها List Comprehension خوانایی خوبی دارد، اما map و filter نیز ابزارهای مهمی هستند و آشنایی با آن‌ها برای یادگیری پایتون و خواندن کدهای دیگران مفید است.

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

نکته مهم درباره map و filter

نکته: خروجی map و filter مستقیماً یک لیست نیست. آن‌ها یک iterator-like object برمی‌گردانند که می‌توانیم با list() آن را به لیست تبدیل کنیم.

result = map(lambda x: x * 2, [1, 2, 3]) print(result)

برای مشاهده عناصر:

print(list(result))
[2, 4, 6]

تمرین‌های map و filter

تمرین ۱

با استفاده از map تمام اعداد زیر را سه برابر کنید:

numbers = [1, 2, 3, 4, 5]

تمرین ۲

با استفاده از filter فقط اعداد فرد را از لیست زیر انتخاب کنید:

numbers = [10, 11, 12, 13, 14, 15]

تمرین ۳

با استفاده از filter نام‌هایی را انتخاب کنید که بیشتر از 4 حرف دارند:

names = ["Ali", "Reza", "Sara", "Mohammad", "Nima"]

تمرین ۴

با ترکیب filter و map، ابتدا اعداد زوج را انتخاب کنید و سپس آن‌ها را به توان 2 برسانید:

numbers = [1, 2, 3, 4, 5, 6, 7, 8]

جمع‌بندی

در این آموزش با دو تابع مهم map() و filter() آشنا شدیم.

  • map() برای اعمال یک عملیات روی عناصر استفاده می‌شود.
  • filter() برای انتخاب عناصر بر اساس یک شرط استفاده می‌شود.
  • هر دو تابع را می‌توان همراه با lambda استفاده کرد.
  • می‌توان map و filter را با یکدیگر ترکیب کرد.
  • برای مشاهده نتیجه می‌توان از list() استفاده کرد.

این دو تابع در پردازش داده‌ها و پروژه‌های پایتونی کاربرد زیادی دارند.

درس‌های مرتبط

سوالات متداول

تابع map در پایتون چیست؟

map یک تابع را روی عناصر یک iterable اجرا می‌کند و نتیجه را به صورت یک map object برمی‌گرداند.

تابع filter در پایتون چیست؟

filter برای انتخاب عناصری استفاده می‌شود که یک شرط مشخص را برقرار می‌کنند.

آیا map و filter با lambda استفاده می‌شوند؟

بله. استفاده از map و filter همراه با lambda یکی از کاربردهای رایج این توابع است.

تفاوت map و filter چیست؟

map روی داده‌ها عملیات انجام می‌دهد و مقدار جدید تولید می‌کند، در حالی که filter داده‌ها را بر اساس یک شرط انتخاب می‌کند.