این حالت نمایش چند صفحه ای قابل پرینت این قسمت می‌باشد. برای پرینت کلیک کنید..

بازگشت به حالت نمایش عادی این قسمت.

معرّفی لیست‌ها

در این فصل و فصل بعد ابتدا خواهید آموخت که لیست‌ها چه هستند و سپس کار کردن با اعضای آن‌ها را آغاز می‌کنید. لیست‌ها امکان ذخیره‌سازی مجموعه‌ای از اطّلاعات (چه به تعداد کم چه میلیون‌ها عدد) را در یک مکان فراهم می‌آورند. لیست‌ها یکی از قدرتمندترین ویژگی‌های پایتون هستند که در اختیار برنامه‌نویسان تازه‌کار قرار گرفته و بسیاری از مفاهیم مهم برنامه‌نویسی را به یکدیگر پیوند می‌دهند.

1 - لیست چیست؟

لیست مجموعه‌ای از عناصر با ترتیبی مشخّص است. می‌توانید لیستی شامل حروف الفبا، اعداد ۰ تا ۹ یا نام تمام افراد خانواده‌ی خود درست کنید. شما می‌توانید هرچه بخواهید درون یک لیست قرار دهید و عناصر داخل لیست الزاماً ارتباطی با یکدیگر ندارند. از آنجایی‌که هر لیست معمولاً بیش از یک عضو دارد بهتر است آن را به صورت جمع نام‌گذاری کنید، مانند letters، digits یا names.

در پایتون از کروشه ( [] ) برای نمایش یک لیست استفاده می‌شود و اعضای داخل آن با کمک کاما از یکدیگر جدا می‌شوند. اینجا مثالی از یک لیست شامل نام چند نوع دوچرخه آورده می‌شود:

1
2
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles)

اگر از پایتون بخواهید که این لیست را چاپ کند، آن را به روش خاص خود، با کروشه، نمایش می‌دهد:

1
['trek', 'cannondale', 'redline', 'specialized']

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

دسترسی به اعضای لیست

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

برای مثال اوّلین نوع دوچرخه را از لیستِ bicycles بیرون می‌کشیم:

1
2
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[0])

روش کار در 2 نمایان است. زمانی که یک عنصر لیست را درخواست می‌کنیم، پایتون آن را بدون کروشه نمایش می‌دهد:

1
trek

این نتیجه‌ای است که انتظار دارید کاربران ببینند– خروجی تمیز و مرتّب.

همچنین می‌توانید متدهای مخصوص رشته‌ها در فصل ۲ را روی هر عضو لیست اعمال کنید. برای مثال می‌توان به کمک متد title() به عضو ’trek’ شکل بهتری داد:

1
2
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[0].title())

این مثال خروجی‌ای همانند مثال قبل تولید می‌کند، با این تفاوت که حرف اول آن را بزرگ می‌کند.

شماره‌گذاری شاخص‌ از ۰ شروع می‌شود نه ۱

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

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

مثال زیر نام دوچرخه‌ها را با شاخص‌های ۱ و ۳ درخواست می‌کند:

1
2
3
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[1])
print(bicycles[3])

این کد دوچرخه‌های دوم و چهارم را برمی‌گرداند:

1
2
cannondale
specialized

پایتون روش خاصی برای دسترسی به آخرین عضو لیست دارد. با فراخواندن عنصر ۱-ام، پایتون آخرین عضو لیست را برمی‌گرداند:

1
2
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[-1])

این کد مقدار ‘specialized’ را برمی‌گرداند. این روش بسیار سودمند است زیرا در بسیاری از موارد شما بدون اطّلاع از تعداد عضوهای لیست می‌خواهید به آخرین عضو دسترسی پیدا کنید. این قاعده را می‌توان به دیگر شاخص‌های منفی نیز گسترش داد: شاخص ۲- عضو دو تا مانده به آخر و ۳- سه تا مانده به آخر را برمی‌گرداند و … .

به‌کارگیری مقادیر اعضای یک لیست

می‌توانید از اعضای یک لیست به صورت جداگانه درست همانند هر متغیّر دیگری استفاده کنید. برای مثال به کمک f-string می‌توانید پیامی بر اساس یکی از عضو‌های لیست ساخت.

اکنون با بیرون کشیدن نام اوّلین دوچرخه و به کمک مقدار آن پیامی تولید می‌کنیم:

1
2
3
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
message = f"My first bicycle was a {bicycles[0].title()}."
print(message)

در خط 2 جمله‌ای به کمک مقدار bicycles[0] ساخته و آن را به متغیّر message نسبت دادیم. خروجی کد جمله‌ای ساده در مورد اوّلین دوچرخه‌ی لیست است:

1
My first bicycle was a Trek.

خودآزمایی

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

نام‌ها

نام چند تن از دوستان خود را در لیستی به نام names ذخیره کنید. نام هر کدام از افراد را یک به یک با فراخواندن هر عضو لیست چاپ کنید.

تبریک

تمرین ۳-۱ را تکرار کنید امّا این دفعه به جای چاپ کردن اسم‌ها به تنهایی، پیامی خطاب به آن‌ها بنویسید. متن هر پیام باید یکسان باشد امّا پیام باید برای هر کس شخصی‌شده باشد.

لیست شخصی

روش حمل و نقل مطلوب خود (موتورسیکلت، ماشین یا …) را در نظر بگیرید، لیستی شامل چند نمونه از آن‌ها درست کنید و عبارت‌هایی در مورد اعضای این لیست چاپ کنید، مثلاً “I would like to own a Honda motorcycle”.

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

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

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

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

برای مثال فرض کنید لیستی از انواع موتورسیکلت داریم می‌خواهیم اوّلین عضو آن که ‘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 دو نام باقیمانده را هم از لیست حذف کنید تا به یک لیست خالی برسید. لیست خود را چاپ کنید تا مطمئن شوید که در پایان برنامه‌ی خود یک لیست خالی باقیمانده است.

3 - سازماندهی یک لیست

گاهی لیست‌های شما با ترتیبی غیر قابل پیش‌بینی ساخته می‌شوند زیرا نمی‌توانید همواره ترتیبی را که کاربران بر اساسِ آن داده‌ها را وارد می‌کنند کنترل کنید. شما معمولاً می‌خواهید داده‌ها را با ترتیبی مشخّص نمایش دهید هرچند در بسیاری از شرایط عملاً مجبور به این کار هستید. گاهی می‌خواهید ترتیب اصلی داده‌ها را حفظ کنید و گاهی آن را تغییر می‌دهید. پایتون بسته به شرایط چند روش مختلف برای سازمان دادن به لیست‌ها ارائه می‌کند.

مرتّب کردن دائمی یک لیست به کمک sort()

متد sort() پایتون مرتّب کردن لیست‌ها را نسبتاً ساده می‌کند. فرض کنید لیستی از خودروها داریم و می‌خواهیم ترتیب لیست را تغییر بدهیم تا آن‌ها را به ترتیب حروف الفبا ذخیره کنیم. برای این که کار راحت‌تر باشد فرض کنید تمام مقادیر لیست با حروف کوچک نوشته شده‌اند.

1
2
3
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.sort()
print(cars)

متد sort() که در 2 نمایش داده شده ترتیب لیست را به صورت دائمی عوض می‌کند. خودروها اکنون دیگر به ترتیب الفبایی هستند و نمی‌توانیم آن‌ها را به ترتیب اولیّه برگردانیم:

1
['audi', 'bmw', 'subaru', 'toyota']

برای مرتّب کردن به ترتیب عکس (از حروف بزرگ به کوچک) می‌توانید نشانوند reverse=True را به متد sort() بدهید. این مثال لیست خودروها را به ترتیب الفبایی معکوس مرتّب می‌کند:

1
2
3
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.sort(reverse=True)
print(cars)

ترتیب لیست مجدداً به طور دائمی تغییر یافته است:

1
['toyota', 'subaru', 'bmw', 'audi']

مرتّب کردن موقّت یک لیست به کمک تابع sorted()

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

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

1
2
3
4
5
6
7
cars = ['bmw', 'audi', 'toyota', 'subaru']
print("Here is the original list:")
print(cars)
print("\nHere is the sorted list:")
print(sorted(cars))
print("\nHere is the original list again:")
print(cars)

ابتدا در2 لیست را با ترتیب اصلی و سپس در 4 به ترتیب حروف الفبا چاپ می‌کنیم. پس از نمایش لیست مرتّب، در ۳ نشان می‌دهیم که ترتیب اصلی لیست دست‌نخورده باقی مانده است.(6)

1
2
3
4
5
6
7
8
Here is the original list:
['bmw', 'audi', 'toyota', 'subaru']

Here is the sorted list:
['audi', 'bmw', 'subaru', 'toyota']

Here is the original list again:
['bmw', 'audi', 'toyota', 'subaru']

دقّت کنید که در 5 و پس از به‌کارگیری تابع sorted() لیست همچنان به ترتیب اصلی خود باقیمانده است. تابع sorted() نیز نشان‌وند reverse=True را برای مرتّب کردن معکوس الفبایی می‌پذیرد.

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

چاپ کردن لیست با ترتیب معکوس

برای عکس کردن ترتیب اصلی یک لیست می‌توانید از متد reverse() استفاده کنید. اگر از ابتدا لیست خودروها را به ترتیب زمانِ خریدن مرتّب کرده باشیم، می‌توانیم به سادگی لیست را به ترتیبِ زمانیِ معکوس بازآرایی کنیم:

1
2
3
4
cars = ['bmw', 'audi', 'toyota', 'subaru']
print(cars)
cars.reverse()
print(cars)

توجّه داشته باشید که reverse() اعضا را به ترتیب عکسِ حروفِ الفبا مرتّب نمی‌کند بلکه تنها به سادگی ترتیب آن‌ها را عکس می‌کند:

1
2
['bmw', 'audi', 'toyota', 'subaru']
['subaru', 'toyota', 'audi', 'bmw']

متد reverse() ترتیب لیست را به طور دائم عوض می‌کند امّا می‌توانید با اعمال دوباره‌ی آن، لیست را به ترتیب اصلی آن برگردانید.

یافتن طول یک لیست

طول یک لیست را می‌توان به سرعت به کمک تابع len() یافت. لیستِ این مثال چهار عضو دارد پس طول آن ۴ است:

1
2
3
>>> cars = ['bmw', 'audi', 'toyota', 'subaru']
>>> len(cars)
4

استفاده از len() هنگامی سودمند است که بخواهید تعیین کنید در بازی چند موجود بیگانه برای کشتن باقیمانده است، تعداد داده‌هایی که برای بصری‌سازی با مدیریت شوند کدام است یا تعداد کاربران ثبت نام کرده در وبسایت چندتاست.

نکته
استفاده از len() هنگامی سودمند است که بخواهید تعیین کنید در بازی چند موجود بیگانه برای کشتن باقیمانده است، تعداد داده‌هایی که برای بصری‌سازی با مدیریت شوند کدام است یا تعداد کاربران ثبت نام کرده در وبسایت چندتاست.

خودآزمایی

تماشای جهان

به پنج نقطه از جهان فکر کنید که دوست دارید آن‌ها از نزدیک ببینید.

  • این مکان‌ها را در لیستی ذخیره کنید. مطمئن شوید که ترتیب ذخیره الفبایی نباشد.
  • لیست را با ترتیب اصلی چاپ کنید. نگران چاپ کردن تمیز و منظم نباشید و لیست را به صورت یک لیست خام پایتون چاپ کنید.
  • از sorted() برای چاپ لیست به ترتیب الفبایی و بدون دست خوردن آن استفاده کنید.
  • نشان دهید که لیست شما همچنان با ترتیب اصلی ذخیره شده است.
  • از sorted() برای مرتّب‌سازی الفبایی معکوس بدون دست زدن به ترتیب لیست اصلی استفاده کنید.
  • نشان دهید که لیست شما همچنان با ترتیب اصلی ذخیره شده است.
  • از reverse() برای معکوس کردن ترتیب اعضای لیست استفاده کنید. آن را چاپ کنید تا نشان دهید که ترتیب عوض شده است.
  • دوباره از reverse() برای معکوس کردن لیست استفاده کنید. نشان دهید که لیست به ترتیب اصلی خود برگشته است.
  • از sort() برای مرتب کردن لیست به ترتیب الفبا استفاده کنید.آن را چاپ کنید تا نشان دهید ترتیب عوض شده است.
  • از sort() برای مرتب کردن لیست به ترتیب الفبایی معکوس استفاده کنید. آن را چاپ کنید تا نشان دهید ترتیب عوض شده است.

مهمان‌های شام

با کار بر روی یکی از تمرین‌های ۳-۴ تا ۳-۷ در صفحه‌ی ***، به کمک len() پیامی چاپ کنید که تعداد افراد دعوت‌شده را نمایش دهد.

تمام تابع‌ها

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

4 - پرهیز از خطای شاخص هنگام کار کردن با لیست‌ها

هنگامی که برای اولین بار با لیست‌ها کار می‌کنید عموماً به نوعی خطا برمی‌خورید. فرض کنید لیستی شامل سه عضو داریم و عضو چهارم آن را فرامی‌خوانیم:

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

این مثال به خطای شاخص منجر می‌شود:

1
2
3
4
Traceback (most recent call last):
File "motorcycles.py", line 2, in <module>
print(motorcycles[3])
IndexError: list index out of range

پایتون برای یافتن عنصری با شاخص ۳ تلاش می‌کند امّا پس از جستجو عضوی با این شماره پیدا نمی‌کند. به دلیل ماهیت یکی‌جابه‌جای شماره‌گذاری در لیست‌ها این خطا متداول است. همه فکر می‌کنند که شماره‌ی سومین عضو ۳ است زیر شمارش را از ۱ شروع می‌کنند. امّا پایتون شاخص سومین عضو را ۲ می‌پندارد زیرا شمارش را از ۰ شروع می‌کند.

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

به خاطر داشته باشید که همیشه می‌توانید با به‌کارگیری شاخص ۱- به آخرین عضو لیست دسترسی پیدا کنید. این مورد همیشه کار می‌کند حتّی اگر طول لیست شما از آخرین باری که به آن دسترسی داشته‌اید تغییر کرده باشد:

1
2
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles[-1])

شاخص ۱- همیشه آخرین عضو لیست را برمی‌گرداند که در این مورد مقدار ‘suzuki’ است:

1
suzuki

تنها زمانی این رویکرد به خطا می‌خورد که آخرین عضو یک لیست تهی را درخواست کنید:

1
2
motorcycles = []
print(motorcycles[-1])

motorcycles هیچ عضوی ندارد پس پایتون خطای شاخص دیگری برمی‌گرداند:

1
2
3
4
Traceback (most recent call last):
File "motorcyles.py", line 3, in <module>
print(motorcycles[-1])
IndexError: list index out of range
نکته
اگر خطای شاخص رخ می‌دهد و نمی‌توانید بفهمید که چگونه آن را برطرف کنید لیست خود یا تنها طول آن را چاپ کنید. لیست شما ممکن است با آن‌چه می‌پنداشتید خیلی تفاوت داشته باشد، به ویژه در مواردی که آن را به صورت پویا در برنامه مدیریت می‌کنید. دیدن لیست واقعی یا تعداد دقیق اعضای آن می‌تواند به سردرآوردن از این خطاهای منطقی کمک کند.

5 - خلاصه

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

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