حذف آیتم های یک لیست در پایتون
چهارشنبه 26 خرداد 1400برای حذف آیتم از لیست، دو گزینه داریم. یکی استفاده از del mylist[i] است که i ایندکس میباشد. دیگری فراخوانی متد mylist.remove(i) است که در آن i آیتمی در لیست است.
به طور کلی اگر شرط خاصی رعایت شود میتوانید آیتم را از لیست حذف کنید. با فرض اینکه میخواهیم اعداد زوج را از mylist حذف کنیم، تکرار با ایندکس منجر به خطا میشود.
Example: Remove Items From List using del
mylist=[5,3,7,8,20,15,2,6,10,1]
l=len(mylist)
for i in range(l):
if (mylist[i]%2==0):
del mylist[i]
Output
IndexError: list index out of range
دلیل این امر این است که با حذف شدن آیتمها، آبجکت لیست به صورت داینامیک تغییر سایز میدهد. از این رو این متد آیتم را حذف میکند در حالی که تکرار لیست کار نمیکند. یک راهحل برای حل این مشکل میتواند استفاده از یک حلقه در حال کاهش باشد. در این مثال سایز لیست 10 است، بنابراین ایندکس کاهش از 9 تا 0 میشود.
Example: Remove Items From List using del
mylist=[5,3,7,8,20,15,2,6,10,1]
for i in range(len(mylist)-1, -1, -1):
if mylist[i]%2==0:
del mylist[i]
print (mylist)
Output
[5, 3, 7, 15, 1]
فراخوانی متد ()remove از آبجکت لیست نیز نتیجه نادرستی را به همراه دارد.
Example: Remove Items From List using remove()
mylist=[5,3,7,8,20,15,2,6,10,1]
for i in mylist:
if (i%2==0):
mylist.remove(i)
print (mylist)
Output
[5, 3, 7, 20, 15, 6, 1]
میبینیم که حتی اعداد 20 و 6 حذف نشده اند. این امر به این دلیل است که وقتی i هشت میشود، حذف میشود و آیتمهای سمت راست قبل از تکرار بعدی یک مکان به سمت چپ حرکت میکنند و 20 آیتم فعلی میشود. به همین ترتیب بعد از حذف 2، 6 آیتم فعلی میشود و از شرایط حذف رها میشود.
پاسخ این وضعیت عجیب استفاده ازList Comprehension است. (List Comprehension در پایتون یک سینتکس آسان و جمع و جور برای ایجاد لیستی از یک رشته یا لیست دیگر است. این یک روش بسیار مختصر برای ایجاد یک لیست جدید با انجام عملیاتی بر روی هر آیتم در لیست موجود است. List comprehension بسیار سریع تر از پردازش لیست با استفاده از حلقه for است).
Example: Remove List Items using List Comprehension
mylist=[5,3,7,8,20,15,2,6,10,1]
mylist=[i for i in mylist if i%2!=0]
print(mylist)
Output
[5, 3, 7, 15, 1]
ما همچنین میتوانیم از تابع داخلی ()filter استفاده کنیم. اولین آرگومان خود تابع است که برای هر آیتم در لیست اعمال میشود و یک تکرارکننده را برمیگرداند که شامل آیتمهای لیست است که آرگومان تابع با true ارزیابی میشود.
Example:Remove List Items using filter()
mylist=[5,3,7,8,20,15,2,6,10,1]
mylist=list(filter(lambda x:x%2!=0, mylist))
print (mylist)
Output
[5, 3, 7, 15, 1]
روش دیگر استفاده از تابع ()filterfalse است که در ماژول itertools تعریف شده است.
from itertools import filterfalse
mylist=[5,3,7,8,20,15,2,6,10,1]
def iseven(i):
if i%2==0:
return i
mylist=list(filterfalse(iseven, mylist))
print (mylist)
Output
[5, 3, 7, 15, 1]
- Python
- 9k بازدید
- 2 تشکر