
مقدمه
تابع درکار (Built-in) filter() در پایتون برای ساخت یک پیمایشگر (Iterator) جدید از روی دادههای قابل پیمایش (Iterable) مانند لیستها یا دیکشنریها استفاده میشود. این تابع بر اساس شرطی که در یک تابع دیگر تعریف میکنید، آیتمهای اضافی را فیلتر کرده و تنها مقادیر مورد نظر شما را خروجی میدهد.
ساختار کلی و سینتکس تابع filter() به شکل زیر است:
filter(function, iterable)
خروجی این دستور یک Filter Object است که خودش نوعی Iterable به شمار میرود. برای تبدیل این خروجی به یک لیست قابل نمایش، میتوانید آن را درون تابع list() قرار دهید.
چرا استفاده از filter() بهینهتر است؟
استفاده از تابع filter() در مقایسه با روشهایی مثل List Comprehension (بهویژه هنگام کار با مجموعهدادههای بزرگ) از نظر مدیریت حافظه رم (RAM) بسیار بهینهتر است. در روش List Comprehension، یک لیست جدید بهطور کامل در حافظه ساخته میشود و تا زمان اتمام پردازش، دو لیست همزمان فضای حافظه را اشغال میکنند. اما تابع filter() یک شیء سبک میسازد که ارجاعی به لیست اصلی، تابع شرطی و نمایه (Index) پیمایش دارد و مقدار بسیار کمتری از حافظه سرور را درگیر میکند.
در این مقاله از وبلاگ پارمین کلود، چهار روش کاربردی برای استفاده از تابع filter() را همراه با مثال مرور میکنیم.
۱. استفاده از filter() همراه با یک تابع معمولی و Lambda
ورودی اول تابع filter()، یک تابع شرطی است. این تابع به ازای تکتک عناصر ورودی اجرا میشود؛ اگر خروجی آن True باشد عنصر نگهداشته میشود و اگر False باشد، آن عنصر فیلتر و حذف میگردد.
الف) استفاده از تابع بینام (Lambda)
اگر شرط شما کوتاه و ساده است، استفاده از تابع lambda بهترین و سریعترین گزینه است:
creature_names = ['Sammy', 'Ashley', 'Jo', 'Olly', 'Jackie', 'Charlie']
# فیلتر کردن اسامی که با حروف صدادار شروع میشوند
vowel_names = filter(lambda x: x[0].lower() in 'aeiou', creature_names)
print(list(vowel_names))
خروجی:
['Ashley', 'Olly']
در این کد:
-
متغیر
xنماینده هر عنصر از لیست است. -
عبارت
x[0].lower()اولین حرف هر اسم را به حروف کوچک تبدیل میکند. -
عبارت
in 'aeiou'بررسی میکند که آیا حرف اول در میان حروف صدادار قرار دارد یا خیر.
ب) استفاده از تابع تعریفشده (def)
برای شرطها و کدهای پیچیدهتر، جهت افزایش خوانایی کد بهتر است یک تابع معمولی با def تعریف کنید:
creature_names = ['Sammy', 'Ashley', 'Jo', 'Olly', 'Jackie', 'Charlie']
def names_vowels(x):
return x[0].lower() in 'aeiou'
filtered_names = filter(names_vowels, creature_names)
print(list(filtered_names))
خروجی:
['Ashley', 'Olly']
۲. پاکسازی مقادیر نادرست (Falsy) با پاس دادن None
اگر اولین آرگومان تابع filter() را مقدار None قرار دهید، این تابع بهصورت خودکار تمامی مقادیری که از نظر پایتون Falsy (نادرست/پوچ) محسوب میشوند را حذف میکند.
در پایتون، مقادیری مانند عدد 0، رشتههای خالی ""، لیستهای خالی []، دیکشنریهای خالی {} و مقدار False همگی Falsy هستند.
aquarium_tanks = [11, False, 18, 21, "", 12, 34, 0, [], {}]
# حذف تمامی مقادیر Falsy
filtered_tanks = filter(None, aquarium_tanks)
print(list(filtered_tanks))
خروجی:
[11, 18, 21, 12, 34]
همانطور که مشاهده میکنید، تمامی عناصر خالی، صفر و مقادیر بولین False از لیست نهایی حذف شدند.
نکته: اگر خروجی
filtered_tanksرا بدون تابعlist()چاپ کنید، عبارتی مانند<filter object at 0x7fafd5903240>را در خروجی میبینید. برای پیمایش آن میتوانید از حلقهforیا تبدیل مستقیم بهlist()استفاده کنید.
۳. فیلتر کردن ساختارهای داده پیچیده (لیستی از دیکشنریها)
در پروژههای واقعی معمولاً با ساختارهای داده پیچیدهتر مانند لیستی از دیکشنریها (مثلاً خروجی APIها یا پایگاههای داده) سرکار داریم. با تابع filter() میتوان درون این ساختارها نیز جستجو انجام داد.
فرض کنید لیستی از مشخصات جانداران یک آکواریوم به شکل زیر داریم:
aquarium_creatures = [
{"name": "sammy", "species": "shark", "tank number": "11", "type": "fish"},
{"name": "ashley", "species": "crab", "tank number": "25", "type": "shellfish"},
{"name": "jo", "species": "guppy", "tank number": "18", "type": "fish"},
{"name": "jackie", "species": "lobster", "tank number": "21", "type": "shellfish"},
{"name": "charlie", "species": "clownfish", "tank number": "12", "type": "fish"},
{"name": "olly", "species": "green turtle", "tank number": "34", "type": "turtle"}
]
میخواهیم تابعی بنویسیم که یک عبارت جستجو (مثلاً عدد "2") را دریافت کرده و تمام دیکشنریهایی که شامل این عبارت هستند را فیلتر کند:
def filter_set(creatures_list, search_string):
def iterator_func(item):
# بررسی تمامی مقدارها (Values) درون هر دیکشنری
for value in item.values():
if search_string in value:
return True
return False
return filter(iterator_func, creatures_list)
# جستجوی تمام آیتمهایی که شامل عدد 2 هستند
filtered_records = filter_set(aquarium_creatures, "2")
print(list(filtered_records))
خروجی:
[
{'name': 'ashley', 'species': 'crab', 'tank number': '25', 'type': 'shellfish'},
{'name': 'jackie', 'species': 'lobster', 'tank number': '21', 'type': 'shellfish'},
{'name': 'charlie', 'species': 'clownfish', 'tank number': '12', 'type': 'fish'}
]
در این کد، تابع درونشهری iterator_func تکتک مقادیر دیکشنری را بررسی کرده و در صورت پیدا کردن کاراکتر "2" در شماره تانکها (مانند ۲۵، ۲۱ و ۱۲)، آن دیکشنری را در خروجی نگه میدارد.
💡 نکته ویژه برنامهنویسان پایتون (افزایش سرعت pip)
اگر پروژههای پایتونی خود را روی سرورهای ابری اجرا میکنید و هنگام نصب پکیجها با Pip با کندی یا تحریم مواجه میشوید، میتوانید پکیجهای مورد نیاز خود را با استفاده از میرور اختصاصی PyPI پارمین کلود با بالاترین سرعت و بدون محدودیت نصب کنید:
pip install --index-url https://pypi.parmincloud.ir/simple/ <package-name>
جمعبندی
تابع filter() یکی از کاربردیترین و بهروزترین ابزارهای پایتون برای مدیریت حافظه و پردازش بهینه دادهها است. با ترکیب این تابع با توابع ساده، توابع lambda یا پاس دادن مقدار None میتوانید کدپایه (Codebase) تمیزتر و سریعتری در پروژههای پردازشی خود داشته باشید.
از همراهی شما با پارمین کلود سپاسگزاریم.




