نحوه ی مرتب کردن لیست ها در زبان برنامه نویسی پایتون


همان گونه که تا به حال در مثال هایی از لیست های مختلف دیدیم، اعضای آن ها به ترتیب مشخصی درون لیست قرار گرفته اند و محل قرار گرفتن هر عضو لیست با اندیسی خاص مشخص می شود. حال فرض کنید لیستی داریم که تمام اعضای آن از نوع استرینگ باشند، برای مثال list1 را در نظر بگیرید:

>>> list1 = ['s', 'r', 'f', 'g', 'n', 'b']

عضو اول این لیست با اندیس 0 استرینگ 's' و عضو پایانی لیست با اندیس 5 استرینگ 'b' است. اگر بخواهیم اعضای این لیست را بر اساس ترتیب حروف الفبای انگلیسی مرتب کنیم، می توانیم از فانکشنی تحت عنوان ()sort استفاده کنیم و آن را روی این لیست به شکل زیر اعمال کنیم:

>>> list1.sort()
>>> list1
['b', 'f', 'g', 'n', 'r', 's']

همان طور که در خروجی می بینید، اکنون ترتیب اعضای list1 تغییر کرده است و اعضاء بر اساس ترتیب حروف الفبای انگلیسی مرتب شده اند. به عنوان مثالی دیگر list2 را در نظر بگیرید:

>>> list2 = ['eat', 'ate', 'tea', 'sea', 'ease', 'see']
>>> list2.sort()
>>> list2
['ate', 'ease', 'eat', 'sea', 'see', 'tea']

همان طور که می بینید، اعضای لیست در ابتدا به ترتیب حروف اول، سپس حروف دوم، و به همین شکل بر اساس ترتیب سایر حروف مرتب می شوند. علاوه بر لیست های شامل اعضایی از نوع استرینگ، لیست هایی که اعضای آن ها از نوع داده ی عددی باشند را هم می توان مرتب کرد. برای مثال لیست زیر را در نظر بگیرید:

>>> list3 = [43, 65, 20, 1, 79, 0.23, 102, 4]
>>> list3.sort()
>>> list3
[0.23, 1, 4, 20, 43, 65, 79, 102]

در این جا اعضای list3 که از نوع داده ی عددی هستند به ترتیب از کوچک به بزرگ مرتب شده اند. موضوعی که باید بدانیم این است که در زبان برنامه نویسی Python، امکان مرتب کردن لیست ها به صورت معکوس نیز فراهم شده است که این کار را به دو روش می توان عملی کرد. در روش اول، ابتدا لیست مورد نظر را با اعمال کردن فانکشن ()sort مرتب می کنیم و آن گاه از فانکشن ()reverse برای معکوس کردن ترتیب اعضای لیست استفاده می کنیم. برای مثال، در کد زیر فانکشن ()reverse را روی لیست مرتب شده ی list3 اثر داده ایم:

>>> list3
[0.23, 1, 4, 20, 43, 65, 79, 102]
>>> list3.reverse()
>>> list3
[102, 79, 65, 43, 20, 4, 1, 0.23]

توجه داشته باشید که فانکشن ()reverse تنها ترتیب قرار گرفتن اعضای لیست را معکوس می کند یعنی اعضاء را از انتهای لیست به ابتدا می چیند، بنابراین اگر در مثال بالا قبل از بکارگیری فانکشن ()sort روی list3، از فانکشن ()reverse استفاده می کردیم، با خروجی زیر مواجه می شدیم:

>>> list3 = [43, 65, 20, 1, 79, 0.23, 102, 4]
>>> list3.reverse()
>>> list3
[4, 102, 0.23, 79, 1, 20, 65, 43]

همان طور که می بینید این بار اشیاء list3 به ترتیب بزرگی و کوچکی مرتب نشده اند و فقط از انتها به ابتدا مرتب شده اند.

روش دیگر برای مرتب کردن معکوس اعضای لیست ها این است که از همان ابتدا آرگومانی را به فانکشن ()sort اضافه می کنیم تا اعضای آن را به صورت معکوس مرتب کند. برای این منظور می توانیم به صورت زیر عمل کنیم:

>>> list1 = ['s', 'r', 'f', 'g', 'n', 'b']
>>> list1.sort(reverse = True)
>>> list1
['s', 'r', 'n', 'g', 'f', 'b']

همان طور که در مثال بالا می بینید، مقدار آرگومان reverse را در فانکشن ()sort که به صورت پیش فرض برابر با مقدار False است True می کنیم، در این صورت این فانکشن عملیات مرتب کردن را به صورت معکوس اجرا خواهد کرد.

توجه به دو نکته در زمان استفاده از فانکشن ()sort روی لیست ها اهمیت دارد. اول این که عملکرد این فانکشن به این صورت نیست که لیست جدید را ایجاد کند بلکه همان لیست اصلی را در صورت نیاز تغییر می دهد و ترتیب قرار گرفتن اعضای آن را عوض می کند. حال اگر بخواهیم یک کپی از لیست اصلی داشته باشیم و به جای لیست اصلی کپی آن را مرتب کنیم به صورت زیر عمل می کنیم:

>>> originalList = ["Narges", "Reza", "Saeed", "Puya", "Marjan", "Saeedeh"]
>>> newList = originalList[:]
>>> newList.sort()
>>> originalList
['Narges', 'Reza', 'Saeed', 'Puya', 'Marjan', 'Saeedeh']
>>> newList
['Marjan', 'Narges', 'Puya', 'Reza', 'Saeed', 'Saeedeh']

در این مثال، یک لیست اصلی با شناسه ی originalList داریم. در دستور دوم، یعنی [:]newList = originalList، یک کپی از این لیست را به متغیر newList منتسب می کنیم. قبلاً گفتیم که برای دسترسی به اعضای یک لیست می توانیم از الگوی [listName[i:j استفاده کنیم که می توان اندیس های i یا j را از آن حذف کرد و اگر هر دو را حذف کنیم تمام اعضای لیست را خواهیم داشت.

شاید برای شما این سوال پیش بیاید که چرا در این جا از این الگو استفاده کرده ایم و چرا قرار نداده ایم newList = originalList. دلیل این کار این است که قبلاً گفتیم نام متغیرها در حقیقت مانند یک برچسب هستند که به یک شیء منتسب می شوند. وقتی دستور newList = originalList را وارد می کنیم، در حقیقت دو برچسب متفاوت originalList و newList را به یک شیء یکسان یعنی لیست ['Narges', 'Reza', 'Saeed', 'Puya', 'Marjan', 'Saeedeh'] منتسب کرده ایم. در این صورت هر تغییری روی یکی از متغیرها، در حقیقت تغییر روی این شیء یکسان خواهد بود و بنابراین مقدار ارجاع داده شده به هر دو متغیر تغییر خواهد کرد.

اما در این جا که از نماد [:] در ادامه ی شناسه ی متغیر originalList استفاده کرده ایم، در حقیقت شیء جدیدی را ایجاد کرده ایم که کپی همان لیست اولیه است و در حالی متغیر newList را به این شیء جدید ارجاع داده ایم که متغیر originalList هم چنان به همان لیست اولیه منتسب است. در نتیجه این دو متغیر به اشیاء متفاوتی منتسب شده اند و تغییر در یکی، تغییر دیگری را به دنبال نخواهد داشت که در ادامه پس از مرتب کردن newList و فراخوانی دو متغیر این نکته کاملاً تأیید می شود.

البته روش دیگری در زبان برنامه نویسی Python وجود دارد تا بدون آن که لیست اصلی را تغییر دهیم، یک کپی از آن لیست گرفته و اعضای آن را مرتب کرد. به این منظور از فانکشن ()sorted استفاده می کنیم. این فانکشن به جای آن که روی یک شیء از نوع لیست اثر کند، یک آرگومان ورودی از نوع لیست می گیرد و ابتدا یک کپی از آن لیست را در قالب یک شیء لیست جدید ایجاد و سپس آن را مرتب می کند. برای مثال کاربرد این فانکشن را در زیر ببینید:

>>> original = [5, 2, 3, 1, 4]
>>> newer = sorted(original)
>>> original
[5, 2, 3, 1, 4]
>>> newer
[1, 2, 3, 4, 5]

در این مثال فانکشن ()sorted، لیست original را به عنوان آرگومان ورودی خود گرفته است و پس از کپی کردن و مرتب کردن اعضای آن، لیست جدید را به متغیری تحت عنوان newer ارجاع داده است؛ همان طور که می بینید لیست original تغییری نکرده است.

علاوه بر نکات فوق باید دقت داشته باشیم که در زمان استفاده از فانکشن های ()sort و ()reverse و ()sorted، حتماً اعضای لیست باید از یک نوع یا بهتر بگوییم از یک نوع کلاس باشند که در غیر این صورت، با خطای زیر مواجه خواهیم شد:

>>> list4 = ['h', 't', 'm', 'p', 10, 8, 32]
>>> list4.sort()
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in 
    list4.sort()
TypeError: unorderable types: int() < str()
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
فردی
فردی
سلام. آیا در مثال بالا میتونانیم بجای ListName[:] از دستور copy() استفاده کنیم؟
محمدهادی
محمدهادی
آره، معلوم نیست فرقشون چیه؟!

در پاسخ به

arya
arya
mersi az amoozeshaye khoobetoon! mikhastam bedoonam key edameye amoozeshatro midin! ba tashakor
ادمین سایت
ادمین سایت
کاربر عزیز سلام
به زودی آموزش های جدید منتشر خواهند شد

با تشکر
ارادتمند
تیم سکان آکادمی

در پاسخ به