چگونه در پایتون Loops را به لیست‌های مفهومی تبدیل کنیم؟

شکل ۱. تبدیل Loops به لیست در پایتون
شکل ۱. تبدیل Loops به لیست در پایتون
منتشر‌شده در: towardsdatascience به تاریخ ۸ می ۲۰۲۱
لینک منبع: How to Convert Loops to List Comprehensions in Python

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

در چنین مواردی، نوشتن نسخه lo o p ابتدا نوشتن کد برای درک لیست را آسان‌تر می‌کند. ما چندین مثال را بررسی خواهیم کرد که نشان می‌دهند چگونه یک نحو حلقه‌ای را به یک درک لیست تبدیل کنیم.

شکل ۲. ساختار اصلی درک لیست
شکل ۲. ساختار اصلی درک لیست
مطالعه مقاله به حداکثر رساندن سودآوری کسب‌وکار خود با پایتون توصیه می‌شود.

بیایید با یک مثال ساده شروع کنیم. ما یک لیست از ۵ عدد صحیح داریم و می‌خواهیم لیستی ایجاد کنیم که شامل مربع‌های هر آیتم باشد. شکل زیر برای حلقه‌ای است که این عملیات را انجام می‌دهد.

lst_a = [1, 2, 3, 4, 5]lst_b = []
for i in lst_a:
lst_b.append(i**2)print(lst_b)
[1, 4, 9, 16, 25]

نسخه مفهومی لیست همان تکلیف:

lst_b = [i**2 for i in lst_a]print(lst_b)
[1, 4, 9, 16, 25]

ما قبلا متوجه شدیم که چگونه لیست مفهومی، ترکیب را ساده می‌کند. آن به عنوان یک تک خطی قدرتمند عمل می‌کند. شکل زیر این تبدیل را نشان می‌دهد.

شکل ۳. لیست مفهومی
شکل ۳. لیست مفهومی

درک لیست با عملیات نهایی آغاز می‌شود. سپس، خطی را قرار می‌دهیم که حلقه را تعریف می‌کند. عملیات قرار داده‌شده در یک درک لیست می‌تواند پیچیده‌تر از یک عملیات ریاضی باشد. لیست اسامی زیر را در نظر بگیرید.

names = ["John Doe", "Jane Doe", "Mike Fence"]

ما می‌خواهیم لیستی تهیه کنیم که تنها شامل نام‌های کوچک باشد. این حلقه است که این وظیفه را انجام می‌دهد:

first_names = []
for name in names:
first_names.append(name.split(" ")[0])print(first_names)
['John', 'Jane', 'Mike']

ما ابتدا رشته نام را در کاراکتر فضایی تقسیم می‌کنیم و سپس اولین کلمه را انتخاب می‌کنیم. این شبیه به مثال قبلی برای تبدیل این حلقه به درک لیست است.

first_names = [name.split(" ")[0] for name in names]print(first_names)
['John', 'Jane', 'Mike']

ما همچنین می‌توانیم اظهارات شرطی را در یک درک لیست قرار دهیم. اجازه دهید مثال قبلی را با یک شرط تکرار کنیم. فهرست نام‌های کوچک تنها شامل نام‌هایی است که با حرف j شروع می‌شوند.

first_names = []
for name in names:
if name.startswith("J"):
first_names.append(name.split(" ")[0])print(first_names)
['John', 'Jane']

ما از روش startswith برای اعمال شرایط مطلوب استفاده می‌کنیم. شرط مشابه به درک لیست به شرح زیر اضافه می‌شود.

first_names = [name.split(" ")[0] for name in names if name.startswith("J")]print(first_names)
['John', 'Jane']

شکل زیر این تبدیل را نشان می‌دهد.

شکل ۴. روش startswith
شکل ۴. روش startswith

ما عملیات نهایی را در ابتدای لیست درک قرار دادیم. سپس، همان طور که با جعبه رنگی نشان‌داده شده‌است، خطوط را از بالا تا پایین دنبال می‌کنیم. اگر از این منطق پیروی کنید، می‌توانید به راحتی حلقه‌های پیچیده را به درک لیست تبدیل کنید. بیایید با چند مثال کمی پیچیده‌تر کار را تمام کنیم. لیست زیر از ۳ لیست را در نظر بگیرید.

lst_a = [[4,3,5], [1,5,3,8], [1,6,2,4]]

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

mylist = []for lst in lst_a:
for item in lst:
if item > 3:
mylist.append(item)print(mylist)
[4, 5, 5, 8, 6, 4]

درک فهرستی که این کار را انجام می‌دهد به صورت زیر است:

mylist = [item for lst in lst_a for item in lst if item > 3]

اگر چه این حلقه پیچیده‌تر از حلقه قبلی است، منطقی که آن را به یک لیست درک شده تبدیل می‌کند یکسان است. با آخرین عملیات در حلقه شروع می‌شود. سپس حلقه را از بالا به پایین دنبال می‌کنیم. هر خط در حلقه به صورت متوالی در درک قرار می‌گیرد.

نتیجه‌گیری

درک لیست سریع‌تر از حلقه‌ها به طور کلی است. با وارد کردن کل لیست به حافظه سریع‌تر می‌شود. حرکت نزولی این روش در هنگام کار با لیست‌های بزرگ وجود دارد (به عنوان مثال، ۱ میلیارد عنصر). این ممکن است باعث شود کامپیوتر شما به خاطر مقدار زیاد حافظه مورد نیاز خراب شود.

یک جایگزین بهتر برای چنین لیست‌های بزرگی استفاده از ژنراتور است که در واقع ساختار داده‌ای بزرگی را در حافظه ایجاد نمی‌کند. یک ژنراتور اقلامی را به نام آن‌ها تولید می‌کند.

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