تغییر دادن، افزودن و حذف کردن عضوها

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

تغییر دادن اعضای لیست

دستور تغییر دادن یک عضو شبیه به دستور دسترسی به عضوهای لیست است. برای تغییر یک عضو باید نام لیست را به همراه شاخص عضوی که می‌خواهید تغییر دهید بنویسید و سپس مقدار جدید را به آن نسبت دهید.

برای مثال فرض کنید لیستی از انواع موتورسیکلت داریم می‌خواهیم اوّلین عضو آن که ‘honda’ است تغییر دهیم. چگونه می‌توانیم این کار را انجام دهیم؟

1
2
3
4
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
motorcycles[0] = 'ducati'
print(motorcycles)

کد خط 1 لیست اولیّه و ‘honda’ را به عنوان اوّلین عضو آن تعریف می‌کند. خط 3 مقدار اوّلین عضو را به ‘ducati’ تغییر می‌دهد. خروجی تغییر اوّلین عضو و دست‌نخورده‌مانده ماندن باقی اعضا را نشان می‌دهد:

1
2
['honda', 'yamaha', 'suzuki']
['ducati', 'yamaha', 'suzuki']

نه فقط اوّلین عضو بلکه تمام اعضای یک لیست را می‌توان تغییر داد.

افزودن عضو به لیست

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

الحاق کردن اعضا به انتهای یک لیست

ساده‌ترین روش برای افزودن یک عضو الحاق کردن آن به لیست است. با این کار عضو به انتهای لیست اضافه می‌شود. با استفاده از لیستی که در مثال قبل ساختیم، یک عضو جدید به نام ‘ducati’ به انتهای آن اضافه می‌کنیم:

1
2
3
4
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
motorcycles.append('ducati')
print(motorcycles)

متد append() در خط 3 ‘ducati’ را بدون اثر گذاشتن بر دیگر اعضا، به لیست اضافه می‌کند:

1
2
['honda', 'yamaha', 'suzuki']
['honda', 'yamaha', 'suzuki', 'ducati']

متد append() ساختن لیست‌ها به روش پویا را ساده می‌کند. برای مثال می‌توانید یک لیست خالی ایجاد کنید و سپس اعضا را یک به یک به آن بیفزایید. اکنون عضوهای ‘honda’، ‘yamaha’ و ‘suzuki’ را به یک لیست خالی اضافه می‌کنیم:

1
2
3
4
5
motorcycles = []
motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')
print(motorcycles)

نتیجه‌ عیناً مشابه لیست‌های مثال‌های قبلی است:

1
['honda', 'yamaha', 'suzuki']

ساختن لیست به این روش بسیار متداول است زیرا معمولاً تا پیش از اجرای برنامه نمی‌دانید که کاربران چه داده‌ای را می‌خواهند ذخیره کنند. برای این که اختیار را به دست کاربران بسپرید ابتدا یک لیست خالی تعریف کنید و سپس مقادیری را که وارد می‌کنند به آن اضافه کنید.

افزودن عضوها داخل لیست

می‌توانید به کمک متد insert() عضو جدیدی را به هر مکانی از لیست اضافه کنید. این کار با مشخّص کردن شاخص و مقدار عنصر جدید انجام می‌شود:

1
2
3
motorcycles = ['honda', 'yamaha', 'suzuki']
motorcycles.insert(0, 'ducati')
print(motorcycles)

در این مثال کد خط 2 مقدار ‘ducati’ را به ابتدای لیست اضافه می‌کند. متد insert() در مکان صفرم فضایی خالی ایجاد می‌کند و مقدار ‘ducati’ را در آن ذخیره می‌کند. این عمل مکان تمام مقادیر دیگر را یکی به راست منتقل می‌کند:

1
['ducati', 'honda', 'yamaha', 'suzuki']

حذف کردن عضوی از لیست

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

حذف کردن یک عضو به کمک عبارت del

اگر مکان عضوی را که می‌خواهید حذف کنید از پیش می‌دانید، می‌توانید از عبارت del استفاده کنید.

1
2
3
4
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
del motorcycles[0]
print(motorcycles)

کد خط 3 از del برای حذف کردن اوّلین عنصر، ‘honda’، از لیست موتورسیکلت‌ها استفاده می‌کند:

1
2
['honda', 'yamaha', 'suzuki']
['yamaha', 'suzuki']

به کمک del می‌توانید هر عضو لیست را در هر مکانی پاک کنید به شرطی که شاخص آن را بدانید. برای مثال اینجا دومین عضو لیست، ‘yahama’، را حذف می‌کنیم:

1
2
3
4
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
del motorcycles[1]
print(motorcycles)

دومین موتورسیکلت از لیست حذف می‌شود:

1
2
['honda', 'yamaha', 'suzuki']
['honda', 'suzuki']

در هر دو مثال، پس از به کارگیری del و حذف شدن عضو، دیگر به مقدار آن دسترسی نخواهید داشت.

حذف کردن یک عنصر به کمک متد pop()

گاهی اوقات پس از حذف کردن یک عضو از لیست به مقدار آن نیاز دارید. مثلاً شاید برای نمایش انفجار روی صفحه‌ی بازی، موقعیّت x و y موجود بیگانه‌ای را که از بین رفته نیاز داشته باشید. یا در برنامه‌ی وب ممکن است بخواهید نام کاربر حذف‌شده را از لیست کاربران فعّال کم کرده و به لیست کاربران غیرفعّال اضافه کنید.

متد pop() آخرین عضو یک لیست را حذف می‌کند امّا اجازه می‌دهد با مقدار حذف شده پس از حذف کار کنید. عبارت pop حاصل نگاه کردن به لیست به عنوان یک پشته و برداشتن بالاترین عضو آن است. در این همانندسازیْ بالای پشته همان انتهای لیست است.

حال آخرین حذف لیست موتورسیکلت‌ها را برمی‌داریم:

1
2
3
4
5
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
popped_motorcycle = motorcycles.pop()
print(motorcycles)
print(popped_motorcycle)

در خط 1 لیست motorcycles را تعریف می‌کنیم. در خط 3 مقداری را از انتهای لیست برداشته و در متغیّری به نام popped_motorcycle ذخیره می‌کنیم. در 4 لیست را چاپ می‌کنیم تا ببینیم که این عضو از آن حذف شده است یا نه. در 5 با چاپ مقدار برداشته شده اطمینان حاصل می‌کنیم که همچنان به مقدار آن دسترسی داریم.

خروجی نشان می‌دهد که مقدار ‘suzuki’ از انتهای لیست حذف شده و در متغیّری به نام popped_variable ذخیره شده است:

1
2
3
['honda', 'yamaha', 'suzuki']
['honda', 'yamaha']
suzuki

متد pop() کی سودمند است؟ فرض کنید که موتورسیکلت‌ها به ترتیبِ تاریخِ خریده شدن در لیست ذخیره شده‌اند. در این مورد می‌توانید از متد pop() جمله‌ای در مورد آخرین موتورسیکلتی که خریده‌ایم چاپ کنیم:

1
2
3
motorcycles = ['honda', 'yamaha', 'suzuki']
last_owned = motorcycles.pop()
print(f"The last motorcycle I owned was a {last_owned.title()}.")

خروج جمله‌ای ساده درباره‌ی آخرین موتورسیکلتی‌ست که صاحب شده‌ایم:

1
The last motorcycle I owned was a Suzuki.

خارج کردن عضو از هرجای لیست

می‌توانید با قرار دادن شاخص عضو در داخلِ پرانتزهای pop()، از این متد برای خارج کردن هر عضوی از هرجای لیست استفاده کنید.

1
2
3
motorcycles = ['honda', 'yamaha', 'suzuki']
first_owned = motorcycles.pop(0)
print(f"The first motorcycle I owned was a {first_owned.title()}.")

ابتدا در 2 موتور سیکلت اول را از لیست برمی‌داریم و سپس پیامی در مورد آن در 3 چاپ می‌کنیم. خروجی درباره‌ی اوّلین موتورسیکلتی که داشته‌ام جمله‌ای ساده چاپ می‌کند:

1
The first motorcycle I owned was a Honda.

به خاطر داشته باشید که هر بار از pop() برای عضوی استفاده می‌کنید، آن را برای همیشه از لیست حذف می‌کنید.

اگر در بین به‌کارگیری del و pop() مردّد هستید راه ساده‌ای برای تصمیم‌گیری وجود دارد: هرگاه دیگر به هیچ‌عنوان به یک عضو احتیاج نداشتید و خواستید آن را حذف کنید از del استفاده کنید امّا اگر خواستید از مقدار آن پس از حذف شدن بهره بگیرید متد pop() را به کاربگیرید.

حذف کردن یک عضو بر اساس مقدار

گاهی مکان عضوی را که می‌خواهید حذف کنید نمی‌دانید. اگر می‌خواهید تنها با دانستن مقدار یک عضو آن را از حذف کنید می‌توانید از متد remove() استفاده کنید.

برای مثال فرض کنید می‌خواهیم مقدار ‘ducati’ را از لیست موتورسیکلت‌ها حذف کنیم:

1
2
3
4
motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
print(motorcycles)
motorcycles.remove('ducati')
print(motorcycles)

خط 3 از پایتون می‌خواهد تا عضوی را با مقدار ‘ducati’ یافته و آن را حذف کند:

1
2
['honda', 'yamaha', 'suzuki', 'ducati']
['honda', 'yamaha', 'suzuki']

از متد remove() برای کار کردن با مقدارهای حذف‌شده نیز می‌توانید استفاده کنید. اکنون مقدار ‘ducati’ را حذف و جمله‌ای درباره‌ی علّت حذف شدن آن چاپ کنیم:

1
2
3
4
5
6
motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
print(motorcycles)
too_expensive = 'ducati'
motorcycles.remove(too_expensive)
print(motorcycles)
print(f"\nA {too_expensive.title()} is too expensive for me.")

پس از تعریف لیست در 1، مقدار ‘ducati’ را در 3 به متغیّری به نام too_expensive منسوب کردیم. سپس در خط 4 از پایتون خواستیم که این مقدار را به کمک این متغیّر از لیست حذف کند. در خط 6 مقدار ‘ducati’ از لیست حذف شده امّا مقدار آن به کمک متغیّر too_expensive در دسترس است و می‌توانیم به کمک آن پیامی در مورد دلیل حذف شدن ‘ducati’ از لیست چاپ کنیم:

1
2
3
['honda', 'yamaha', 'suzuki', 'ducati']
['honda', 'yamaha', 'suzuki']
A Ducati is too expensive for me.
نکته
متد remove() اوّلین مورد وقوع مقداری را که مشخّص کرده‌اید حذف می‌کند. اگر این امکان وجود دارد که یک مقدار چند بار تکرار شده باشد ، از یک حلقه برای اطمینان یافتن از حذف تمامی موارد آن مقدار استفاده کنید. چگونگی این کار را در فصل هفتم خواهید آموخت.

خودآزمایی

تمرین‌های زیر نسبت به فصل ۲ کمی پیچیده‌ترند امّا به شما این فرصت را می‌دهند تا از لیست‌ها به تمام روش‌هایی که توضیح داده شد استفاده کنید.

لیست مهمان

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

تغییر دادن لیست مهمانان

همین الان متوجه شدید که یکی از مهمان‌ها نمی‌تواند برای شام بیاید، در نتیجه به ارسال دعوت‌نامه‌های جدید نیاز پیدا کردید. باید کس دیگری را برای مهمانی پیدا کنید.

  • از برنامه تمرین ۳-۴ شروع کنید.یک تابع print() اضافه کنید و در پایان برنامه نام شخصی را که نمی‌تواند به مهمانی بیاید چاپ کنید.
  • لیست را تغییر دهید و نام کسی را که دعوت را نپذیرفته با نام مهمان جدید جایگزین کنید.
  • دسته‌ی دوم دعوت‌نامه را برای هر یک از افرادی که هنوز در لیست هستند چاپ کنید.

مهمان‌های بیشتر

میز شام جدیدی پیدا کرده‌اید و اکنون جا برای مهمان‌های بیشتری باز شده است. سه فرد جدید برای دعوت کردن بیابید.

  • از برنامه تمرین ۳-۴ یا ۳-۵ شروع کنید. یک تابع print() به انتهای برنامه بیفزایید و به همه اطّلاع دهید که میز شام بزرگتری پیدا کردید.
  • با استفاده از insert() یک مهمان جدید به ابتدای لیست بیفزایید.
  • به کمک insert() مهمانی جدید به میانه‌ی لیست اضافه کنید.
  • از append() بهره بگیرید و مهمان جدید دیگری را به انتهای لیست اضافه کنید.
  • یک دعوت‌نامه جدید برای هر یک از افراد حاضر در لیستِ خود چاپ کنید.

کوچک کردن لیست مهمان

مطّلع شده‌اید که میز شام جدید به موقع نمی‌رسد و تنها برای دو مهمان جا دارید.

  • از برنامه ۳-۶ شروع کنید خط جدیدی به آن اضافه و پیامی چاپ کنید که تنها می‌توانید دو مهمان دعوت کنید.
  • برای حذف کردن مهمان‌ها، چند بار از pop() استفاده کنید تا تنها دو مهمان در لیست باقی بماند. هر بار که نامی را از لیست حذف می‌کنید پیامی خطاب به آن فرد چاپ کنید و از او به دلیل مشکل پیش آمده عذر بخواهید.
  • پیامی خطاب به دو مهمان باقی‌مانده در لیست چاپ کنید و به آن‌ها اطّلاع دهید که همچنان دعوت هستند.
  • با استفاده از del دو نام باقیمانده را هم از لیست حذف کنید تا به یک لیست خالی برسید. لیست خود را چاپ کنید تا مطمئن شوید که در پایان برنامه‌ی خود یک لیست خالی باقیمانده است.