درک لیست (List Comprehension) یکی از قابلیتهای قدرتمند پایتون است که امکان ساخت لیستها را به شکلی مختصر، خوانا و تابعمحور فراهم میکند. این روش بر اساس قواعد مشخص و درون یک جفت براکت نوشته میشود و معمولاً شامل یک حلقه و در صورت نیاز، شرط نیز هست.
# محاسبه مکعب اعداد از ۰ تا ۴
cubes = [i ** 3 for i in range(5)]
print(cubes)
خروجی:
[0, 1, 8, 27, 64]
افزودن شرط: میتوانید از عبارت if
برای فیلتر کردن مقادیر داخل درک لیست استفاده کنید. مثال زیر فقط مقادیری را اضافه میکند که مربعشان زوج باشد:
evens = [i ** 2 for i in range(10) if i ** 2 % 2 == 0]
print(evens)
خروجی:
[0, 4, 16, 36, 64]
استفاده با if-else
در درک لیست: میتوانید از شرط if-else
در خود عبارت نیز استفاده کنید. این کاربرد برای زمانیست که بخواهید مقدار جایگزین مشخصی در صورت برقرار نبودن شرط برگردانید.
labels = ["even" if i % 2 == 0 else "odd" for i in range(5)]
print(labels)
خروجی:
['even', 'odd', 'even', 'odd', 'even']
نکته مهم: اگر اندازه خروجی بسیار بزرگ باشد، مانند استفاده از range(10**100)
، حافظه سیستم شما پر شده و با خطای MemoryError
مواجه خواهید شد.
# هشدار: اجرای این خط باعث MemoryError خواهد شد
even = [2 * i for i in range(10**100)]
راهحل: استفاده از Generator Expression به جای List Comprehension زمانی که نیاز به مصرف پایین حافظه دارید:
even_gen = (2 * i for i in range(10**100))
print(next(even_gen))
print(next(even_gen))
پیشرفتها در نسخههای جدید پایتون:
- در پایتون 3.8 به بعد، List Comprehension میتواند در کنار
:=
(Walrus Operator) برای انتساب درونخطی استفاده شود.
result = [y for x in range(10) if (y := x**2) > 10]
print(result)
خروجی:
[16, 25, 36, 49, 64, 81]
کاربردهای رایج List Comprehension:
# حذف فاصلههای اضافی از رشتهها
cleaned = [s.strip() for s in [" apple ", " banana ", " cherry"]]
# فیلتر کردن لیست اسامی با شرط طول
names = [name for name in ["Ali", "Sara", "Mohammad", "Zahra"] if len(name) > 4]
# ساختن جدول ضرب
table = [f"{i}×{j}={i*j}" for i in range(1, 4) for j in range(1, 4)]
درک لیستها ترکیبی از سادگی و قدرت را به پایتون دادهاند و در بسیاری از اسکریپتهای واقعی به چشم میخورند. اگر عملکرد یا حافظه برایتان مهم است، Generator Expression جایگزین مناسبیست.