آموزش پایتون - لیستساز فشرده
List Comprehension در پایتون
یک list comprehension روشی کوتاه و فشرده برای ساخت لیستها است. این مفهوم شبیه به ریاضیات و تعریف مجموعهها بر اساس ویژگیهای اعضای آن است. از آن برای تعریف یک لیست بر اساس یک شیء قابلپیمایش (iterable) موجود، مانند لیست، تاپل یا رشته، و اعمال یک عبارت (expression) روی هر عنصر از آن استفاده میشود.
سنتکس List Comprehension در پایتون
سنتکس پایه list comprehension به صورت زیر است:
new_list = [expression for item in iterable if condition]
در این ساختار:
- expression عملیات یا تغییر شکلی است که روی هر عضو از قابلپیمایش اعمال میشود.
- item متغیری است که نماینده هر عنصر در قابلپیمایش است.
- iterable دنبالهای از عناصر است که روی آن پیمایش انجام میشود.
- condition (اختیاری) عبارتی است که عناصر را بر اساس یک شرط مشخص فیلتر میکند.
مثالی از List Comprehension در پایتون
فرض کنید میخواهیم تمام حروف موجود در رشته "hello world" را به حروف بزرگ تبدیل کنیم. با استفاده از list comprehension، روی هر کاراکتر پیمایش میکنیم، بررسی میکنیم که آیا حرف است یا خیر، و در صورت حرف بودن، آن را به حروف بزرگ تبدیل میکنیم که در نهایت لیستی از حروف بزرگ حاصل میشود:
string = "hello world"
uppercase_letters = [char.upper() for char in string if char.isalpha()]
print(uppercase_letters)
نتیجه بهدستآمده به صورت زیر نمایش داده میشود:
['H', 'E', 'L', 'L', 'O', 'W', 'O', 'R', 'L', 'D']
List Comprehension و Lambda
در پایتون، lambda کلیدواژهای است که برای ساخت توابع بینام (anonymous functions) استفاده میشود. تابع بینام، تابعی است که بدون نام تعریف میشود. این توابع با استفاده از کلیدواژه lambda و بهدنبال آن لیستی از آرگومانها که با کاما از هم جدا شدهاند، سپس علامت دو نقطه : و در نهایت عبارتی که باید محاسبه شود، ساخته میشوند.
میتوانیم با اعمال تابع lambda روی هر عنصر از یک قابلپیمایش در درون comprehension، از list comprehension همراه با lambda استفاده کرده و یک لیست جدید تولید کنیم.
مثال
در مثال زیر، از list comprehension همراه با یک تابع lambda استفاده میکنیم تا هر عنصر موجود در لیست دادهشده original_list را دو برابر کنیم. ما روی هر عنصر در original_list پیمایش کرده و تابع lambda را برای دو برابر کردن آن اعمال میکنیم:
original_list = [1, 2, 3, 4, 5]
doubled_list = [(lambda x: x * 2)(x) for x in original_list]
print(doubled_list)
خروجی کد بالا به صورت زیر است:
[2, 4, 6, 8, 10]
حلقههای تودرتو در List Comprehension پایتون
حلقه تودرتو (nested loop) در پایتون، حلقهای درون یک حلقه دیگر است که در آن، حلقه داخلی به ازای هر بار اجرای حلقه خارجی، چندین بار اجرا میشود.
میتوانیم با قرار دادن یک حلقه درون حلقه دیگر، از حلقههای تودرتو در list comprehension استفاده کنیم که امکان ساخت فشرده و کوتاه لیستها از روی چندین پیمایش را فراهم میکند.
مثال
در این مثال، تمام ترکیبهای ممکن از عناصر دو لیست به صورت تاپل به یک شیء لیست سوم اضافه میشوند:
list1=[1,2,3]
list2=[4,5,6]
CombLst=[(x,y) for x in list1 for y in list2]
print (CombLst)
این کد خروجی زیر را تولید خواهد کرد:
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
عبارات شرطی در List Comprehension پایتون
شرطها در پایتون به استفاده از دستوراتی مانند "if"، "elif" و "else" برای کنترل جریان کد بر اساس شرایط خاص اشاره دارند. آنها به شما این امکان را میدهند که بلاکهای مختلفی از کد را بسته به اینکه یک شرط ارزیابیشده "True" یا "False" باشد، اجرا کنید.
میتوانیم با قرار دادن عبارات شرطی پس از قابلپیمایش و قبل از حلقه، از آنها در list comprehension استفاده کنیم که این کار باعث میشود عناصر قابلپیمایش هنگام ساخت لیست، بر اساس شرط مشخصشده فیلتر شوند.
مثال
مثال زیر از عبارات شرطی در یک list comprehension برای تولید لیستی از اعداد زوج بین ۱ تا ۲۰ استفاده میکند:
list1=[x for x in range(1,21) if x%2==0]
print (list1)
خروجی را به صورت زیر دریافت میکنیم:
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
مقایسه List Comprehension و حلقه For
هر دو روش list comprehension و حلقه for برای پیمایش استفاده میشوند، اما از نظر سنتکس و نحوه استفاده با یکدیگر متفاوت هستند.
روش List comprehension مانند یک راه میانبر برای ساخت لیست در پایتون است. به شما این امکان را میدهد که با اعمال یک عملیات روی هر آیتم از یک لیست موجود، یک لیست جدید تولید کنید.
از طرف دیگر، حلقه for یک دستور کنترل جریان است که برای پیمایش تکتک عناصر یک قابلپیمایش و اجرای یک بلاک کد به ازای هر عنصر استفاده میشود.
غالباً برای عملیاتهای سادهتر List comprehension ترجیح داده میشود، در حالی که حلقههای for انعطافپذیری بیشتری برای کارهای پیچیده ارائه میدهند.
مثال با استفاده از حلقه For
فرض کنید میخواهیم هر حرف از یک رشته را جدا کرده و تمام حروف غیرصدادار را در یک شیء لیست قرار دهیم. میتوانیم این کار را با یک حلقه for مطابق زیر انجام دهیم:
chars=[]
for ch in 'TutorialsPoint':
if ch not in 'aeiou':
chars.append(ch)
print (chars)
شیء لیست chars به صورت زیر نمایش داده میشود:
['T', 't', 'r', 'l', 's', 'P', 'n', 't']
مثال با استفاده از List Comprehension
میتوانیم همین نتیجه را بهراحتی با تکنیک list comprehension به دست آوریم. استفاده عمومی از list comprehension به صورت زیر است:
listObj = [x for x in iterable]
با اعمال این روش، لیست chars را میتوان با دستور زیر ساخت:
chars = [ char for char in 'TutorialsPoint' if char not in 'aeiou']
print (chars)
لیست chars مانند قبل نمایش داده خواهد شد:
['T', 't', 'r', 'l', 's', 'P', 'n', 't']
مثال
مثال زیر از list comprehension برای ساخت لیستی از مربع اعداد بین ۱ تا ۱۰ استفاده میکند:
squares = [x*x for x in range(1,11)]
print (squares)
شیء لیست squares برابر است با:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
مزایای List Comprehension
مزایای استفاده از list comprehension به شرح زیر است:
-
کوتاه و فشرده بودن − عبارات List comprehension در مقایسه با حلقههای традицион (سنتی) for کوتاه تر و خواناتر هستند و به شما این امکان را میدهند که با کد کمتری لیست بسازید.
-
کارایی − ساختارهای List comprehension به طور کلی سریعتر و کارآمدتر از حلقههای for هستند، زیرا به صورت داخلی توسط مفسر پایتون بهینهسازی میشوند.
-
وضوح − روش List comprehension منجر به کدی واضحتر و با قدرت بیان بالاتر میشود و درک هدف و منطق عملیاتی را که انجام میشود آسانتر میکند.
-
کاهش احتمال خطا − از آنجا که list comprehension فشردهتر است، احتمال بروز خطا در مقایسه با حلقههای traditional (سنتی) for کمتر بوده و احتمال وجود باگ در کد شما کاهش مییابد.
پیشرفت مطالعه: وضعیت خواندهشدن این درس فقط در همین مرورگر ذخیره میشود؛ بدون نیاز به حساب کاربری.