برای ایجاد یک لیست جدید در پایتون با استخراج یا حذف فقط آن دسته از عناصر یک لیست موجود (آرایه) که شرایط خاصی را برآورده می کند، یا با انجام جایگزینی یا تبدیل، از درک لیست استفاده کنید.
در اینجا موارد زیر به همراه کد نمونه توضیح داده شده است.
- شکل اصلی نشانه گذاری درک لیست
- فرآیند را برای همه عناصر لیست اعمال کنید
- عناصری را که دارای معیارها هستند را از لیست استخراج و حذف کنید
- عناصری را که شرایط لیست را برآورده می کنند جایگزین یا تبدیل کنید
برای نمونه های خاص از لیست رشته ها به مقاله زیر مراجعه کنید.
همچنین می توان به صورت تصادفی عناصری را که معیارها را برآورده نمی کنند استخراج کرد.
توجه داشته باشید که لیست ها می توانند انواع مختلفی از داده ها را ذخیره کنند و کاملاً با آرایه ها متفاوت هستند. اگر میخواهید آرایههایی را در فرآیندهایی مدیریت کنید که به اندازه حافظه و آدرسهای حافظه یا پردازش عددی دادههای بزرگ نیاز دارند، از آرایه (کتابخانه استاندارد) یا NumPy استفاده کنید.
لیست زیر یک نمونه است
l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
شکل اصلی نشانه گذاری درک لیست
هنگام ایجاد یک لیست جدید از یک لیست، نوشتن درک لیست ساده تر از حلقه ها است.
[expression for any variable name in iterable object if conditional expression]
عبارتی به عنصری اعمال میشود که عبارت شرطی یک شیء قابل تکرار (مانند یک لیست یا تاپل) را برآورده میکند و به عنصری از یک لیست جدید تبدیل میشود. «اگر عبارت شرطی» را می توان حذف کرد، در این صورت عبارت به همه عناصر اعمال می شود.
برای جزئیات بیشتر، از جمله نشانه گذاری درک لیست تودرتو، مقاله زیر را ببینید.
فرآیند را برای همه عناصر لیست اعمال کنید
به عنوان مثال، اگر می خواهید مقداری پردازش را برای تمام عناصر یک لیست اعمال کنید، پردازش مورد نظر را در عبارت درک لیست بالا توضیح دهید.
l_square = [i**2 for i in l]
print(l_square)
# [25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]
l_str = [str(i) for i in l]
print(l_str)
# ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5']
این می تواند برای تبدیل بین لیست اعداد و لیست رشته ها استفاده شود.
عناصری را که دارای معیارها هستند را از لیست استخراج و حذف کنید
اگر عنصر فقط با یک عبارت شرطی انتخاب شود، توسط یک عبارت پردازش نمیشود، بنابراین شکل زیر را به خود میگیرد.
[variable name for variable name in original list if conditional expression]
یک لیست جدید تولید می شود که از آن فقط عناصری که شرط را برآورده می کنند (عناصری که عبارت شرطی برای آنها درست است) استخراج می شود.
l_even = [i for i in l if i % 2 == 0]
print(l_even)
# [-4, -2, 0, 2, 4]
l_minus = [i for i in l if i < 0]
print(l_minus)
# [-5, -4, -3, -2, -1]
اگر «اگر عبارت شرطی» روی «اگر عبارت شرطی نباشد» تنظیم شود، تبدیل به نفی می شود و تنها عناصری که شرط را برآورده نمی کنند (عناصری که عبارت شرطی برای آنها نادرست است) می توانند انتخاب و استخراج شوند. به عبارت دیگر، یک لیست جدید تولید می شود که از آن عناصری که شرایط را برآورده می کنند حذف می شوند.
l_odd = [i for i in l if not i % 2 == 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if not i < 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
البته همین نتیجه با تعیین عبارت شرطی معادل بدون استفاده از not به دست می آید.
l_odd = [i for i in l if i % 2 != 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if i >= 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
قسمت عبارت شرطی می تواند چندین شرط باشد. از نت های منفی نیز می توان استفاده کرد.
l_minus_or_even = [i for i in l if (i < 0) or (i % 2 == 0)]
print(l_minus_or_even)
# [-5, -4, -3, -2, -1, 0, 2, 4]
l_minus_and_odd = [i for i in l if (i < 0) and not (i % 2 == 0)]
print(l_minus_and_odd)
# [-5, -3, -1]
عناصری را که شرایط لیست را برآورده می کنند جایگزین یا تبدیل کنید
در مثال استخراج عنصر بالا، عناصری که شرایط را برآورده نمی کردند حذف شدند.
اگر میخواهید جایگزینها، تبدیلها و غیره را فقط روی عناصری انجام دهید که شرایط را برآورده میکنند، عملگر سه تایی را در قسمت بیانی نماد درک لیست اعمال کنید.
در پایتون عملگر سه تایی را می توان به صورت زیر نوشت
True Value if Conditional Expression else False Value
a = 80
x = 100 if a > 50 else 0
print(x)
# 100
b = 30
y = 100 if b > 50 else 0
print(y)
# 0
این کمی پیچیده است، اما ترکیبی از نماد درک لیست و عملگرهای سه تایی به شرح زیر است.
[True Value if Conditional Expression else False Value for any variable name in original list]
قسمت محصور در پرانتز عملگر سه تایی است (پرانتز در کد واقعی ضروری نیست).
[(True Value if Conditional Expression else False Value) for any variable name in original list]
اگر نام هر متغیری برای مقادیر درست یا نادرست همانطور که هست نوشته شود، مقدار عنصر اصلی همانطور که هست استفاده می شود. اگر عبارتی نوشته شود، پردازش آن عبارت اعمال می شود.
l_replace = [100 if i > 0 else i for i in l]
print(l_replace)
# [-5, -4, -3, -2, -1, 0, 100, 100, 100, 100, 100]
l_replace2 = [100 if i > 0 else 0 for i in l]
print(l_replace2)
# [0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100]
l_convert = [i * 10 if i % 2 == 0 else i for i in l]
print(l_convert)
# [-5, -40, -3, -20, -1, 0, 1, 20, 3, 40, 5]
l_convert2 = [i * 10 if i % 2 == 0 else i / 10 for i in l]
print(l_convert2)
# [-0.5, -40, -0.3, -20, -0.1, 0, 0.1, 20, 0.3, 40, 0.5]