از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
Python – روش مرتب سازی لیست با sort() و sorted()
سرفصلهای مطلب
در این راهنمای کوتاه، یاد بگیرید که چگونه مرتب کردن لیست در پایتون با استفاده از داخلی sort()
و sorted()
کارکرد.
sort()
یک روش ازlist
کلاس، و لیست را در جای خود مرتب می کند، عودتNone
.sorted()
متدی است که در فضای نام پایتون ساخته شده است و فهرست را بی جا مرتب می کند، بازگشت الف کپی مرتب شده از لیست، بدون اینکه روی اصلی تاثیر بگذارد.
به طور کلی – sort()
کارآمدتر است روی مجموعه داده های بزرگتر، در حالی که sorted()
راحت تر است، زیرا یک کپی از لیست را برمی گرداند و نسخه اصلی را دست نخورده باقی می گذارد.
توجه داشته باشید: هر دو روش به طور پیش فرض از منطقی کمتر از (<
) عملگر برای مقایسه عناصر و در نتیجه مرتب سازی ترتیب صعودی. شما میتوانید تابع مقایسه پیشفرض را نادیده بگیرید و با توسعه، هم منطق مقایسه و هم ترتیب مرتبسازی را لغو کنید.
در بخشهای بعدی، روش مرتبسازی فهرستهایی از انواع دادهها، از جمله توابع مقایسه سفارشی، ترتیب نزولی، و انجام یک معیار عملکرد را بررسی خواهیم کرد. روی این دو
مرتب سازی لیست با sort() و sorted()
را sort()
تابع نامیده می شود روی آ list
ما میخواهیم مرتب کنیم، و آن را در جای خود مرتب کنیم و برگردیم None
:
my_list.sort()
مرتب می کند ترتیب صعودی به صورت پیش فرض. برای مرتب کردن ترتیب نزولی، می توانید عرضه کنید reverse=True
آرگومان تابع:
my_list.sort(reverse=True)
را sorted()
عملکرد تقریباً به همان روشی عمل می کند sort()
تابع انجام می دهد – و همچنین همان آرگومان ها را می پذیرد. با این حال، sorted()
یک کپی از لیستی که ما ارائه می کنیم ایجاد می کند، کپی را مرتب می کند و آن را برمی گرداند – اصل را دست نخورده باقی می گذارد:
sorted_list = sorted(my_list)
روش انجام مقایسه بستگی دارد روی نوع داده عناصر لیست رشته ها متفاوت از اعداد صحیح مقایسه می شوند که به نوبه خود با اشیاء سفارشی متفاوت مقایسه می شوند.
مرتب سازی لیست رشته ها
رشته ها در مقایسه با رشته ها از نظر واژگانی مرتب شده اند >
اپراتور:
string_list = ('I', 'see', 'skies', 'of', 'blue', 'red', 'roses', 'too')
string_list.sort()
print(string_list)
همین منطق در مورد هم اعمال می شود sorted()
تابع:
sorted_list = sorted(string_list)
print(sorted_list)
I
از ارزش واژگانی کمتری برخوردار است blue
، بااینکه b
باید قبل از i
در فرهنگ لغت، زیرا حروف بزرگ همیشه ارزش واژگانی کمتری نسبت به حروف کوچک دارند. به غیر از حروف بزرگ – بقیه رشته ها به ترتیب صعودی فرهنگ لغت مرتب شده اند!
مرتب سازی لیست اعداد صحیح
اعداد صحیح در مقایسه با اعداد ساده تر هستند >
اپراتور:
int_list = (1, 7, 2, 3, 8, 5, 6)
int_list.sort()
print(int_list)
یا، با sorted()
:
sorted_list = sorted(int_list)
print(sorted_list)
مرتب سازی لیست تاپل ها
تاپل ها بر اساس مرتب شده اند کلید، نه ارزش. به عنوان مثال، فرض کنید که شما یک جدول از زبان های برنامه نویسی ترجیحی دارید که در چندین زبان ذخیره شده است (language, rank)
قالب – ممکن است بخواهید آنها را به ترتیب رتبه مرتب کنید:
tuple_list = (('Java', 2), ('Python', 1), ('JavaScript', 3))
tuple_list.sort()
print(tuple_list)
یا، برای مرتب کردن لیستی از تاپل ها با sorted()
:
sorted_tuples = sorted(tuple_list)
print(sorted_tuples)
از آنجایی که تاپل ها بر اساس طبقه بندی می شوند کلید، این لیست از تاپل ها از نظر واژگانی و بر اساس رشته هایی که به عنوان کلید استفاده می شوند مرتب شده اند.
مرتب سازی لیست تاپل ها با کلید سفارشی
برای تغییر آیتم بر اساس روی کدام تاپل ها بدون تغییر تاپل ها مرتب می شوند خودشان – شما می توانید هر مورد را در یک تاپل به جای آن به عنوان مشخص کنید key
بحث و جدل. به طور معمول، این ساده ترین است نقشه کلید یک مورد دیگر در لیست تاپل ها، از طریق a lambda
تابع:
tuple_list = (('Java', 2), ('Python', 1), ('JavaScript', 3))
tuple_list.sort(key=lambda x:x(1))
print(tuple_list)
یا، با sorted()
:
sorted_tuples = sorted(tuple_list, key=lambda x:x(1))
print(sorted_tuples)
در اینجا، ما نقشه برداری کرده ایم کلید که توسط آن به مرتب کردن، به مورد دوم (نمایهسازی بر مبنای 0 است) تاپل، بنابراین، بر اساس مورد دوم (عدد صحیح) مرتب میشود.
اگر مایلید در مورد توابع لامبدا بیشتر بخوانید – راهنمای ما برای توابع لامبدا در پایتون را بخوانید!
توجه داشته باشید: را key
با اولین مقدار تاپل مطابقت ندارد، که اغلب به عنوان یک “کلید” مانند یک جفت “کلید-مقدار” نامیده می شود. را key
اشاره به key
که توسط آن sort()
روش عناصر را مرتب می کند.
این برای هر تعدادی از عناصر چندگانه صادق است:
tuple_list = (('Java', 2, 'General purpose'), ('Python', 1, 'General purpose'), ('JavaScript', 3, 'Web-oriented'))
tuple_list.sort(key=lambda x:x(1))
print(tuple_list)
یا، با sorted()
:
sorted_tuples = sorted(tuple_list, key=lambda x:x(1))
print(sorted_tuples)
مرتب سازی لیست با مقایسه کننده سفارشی
در نهایت، ممکن است بخواهید یک مقایسه کننده سفارشی برای آن تهیه کنید key
استدلال هر کدام sort()
یا sorted()
! آ مقایسه کننده به سادگی تابعی است که نوع بازگشتی قابل مقایسه را برمی گرداند. به عنوان مثال، می توانید با عبور در طول، مرتب سازی کنید len()
تابع:
string_list = ('I', 'see', 'skies', 'of', 'blue', 'red', 'roses', 'too')
string_list.sort(key=len)
print(string_list)
یا، با sorted()
:
sorted_list = sorted(string_list, key=len)
print(sorted_list)
به طور مشابه، می توانید بر اساس هر تابع سفارشی مرتب کنید:
def custom_comparator(element):
return element(-1)
string_list = ('I', 'see', 'skies', 'of', 'blue', 'red', 'roses', 'too')
string_list.sort(key=custom_comparator)
print(string_list)
یا، با sorted()
:
sorted_list = sorted(string_list, key=custom_comparator)
print(sorted_list)
در اینجا، ما به سادگی آن را برگردانده ایم آخرین کاراکتر یک رشته، از طریق نماد برش، و بر اساس نویسه برگشتی مرتب شده است. اگر به آخرین کاراکتر هر کلمه (به استثنای حرف بزرگ) توجه کنید – آنها به ترتیب واژگانی مرتب شده اند.
محک زدن مرتب سازی() در مقابل مرتب شده ()
همانطور که قبلا گفته شد – sorted()
کمی کارآمدتر از sort()
، عمدتاً به این دلیل که به جای تغییر مجموعه اصلی، یک کپی ایجاد می کند و آن کپی را مرتب می کند. اگرچه، چقدر است “کمی کمتر” کارآمد؟
این بستگی دارد روی عوامل مختلف – مانند سخت افزار شما، و مشخصات آن سخت افزار، اما شما می توانید یک آزمایش بسیار ساده را اجرا کنید تا بررسی کنید که کدام یک برای شما بهتر کار می کند. روی اندازه ورودی چندگانه
بیایید لیست هایی از 10، 100 و 1000 عنصر را به ترتیب مرتب کنیم و زمان اجرای این توابع را با استفاده از timeit
. برای اطمینان از عادلانه بودن آزمون، میخواهیم اطمینان حاصل کنیم که:
- لیست عناصر قبل از فراخوانی ایجاد می شود
timeit()
بنابراین منطق تولید برای زمان معیار محاسبه نمی شود - روش ها اجرا می شوند روی دقیقا همان ورودی
از آنجا که sort()
لیست ها را در جای خود تغییر می دهد، اجرا می کنیم sorted()
ابتدا، و سپس معیاری برای مدت زمانی که طول می کشد sort()
برای انجام همان لیست ها:
import timeit
import random
def generate_random_strings(num):
result = ()
for i in range(num):
s = ''.join(random.choice((chr(i) for i in range(ord('a'),ord('z')))) for _ in range(5))
result.append(s)
return result
ten = generate_random_strings(10)
hundred = generate_random_strings(100)
thousand = generate_random_strings(1000)
mapping = {
10:'ten',
100:'hundred',
1000:'thousand'
}
def run_sort(num):
eval(f'{mapping(num)}.sort()')
def run_sorted(num):
eval(f'sorted({mapping(num)})')
for index, num_samples in enumerate((10, 100, 1000)):
result = timeit.timeit(f"run_sorted({num_samples})", number=100000, globals=globals())
print(f'sorted() روی {num_samples} took {result} seconds')
print('____________________________________________________')
for index, num_samples in enumerate((10, 100, 1000)):
result = timeit.timeit(f"run_sort({num_samples})", number=100000, globals=globals())
print(f'sort() روی {num_samples} took {result} seconds')
این قطعه کد زمان لازم برای اجرای 100 هزار تکرار از هر یک از کدها را مقایسه می کند run_sort()
و run_sorted()
مواد و روش ها، روی همان لیست های 10، 100، 1000، و 1000000 عنصری تولید شده توسط generate_random_strings()
روش، و نتایج:
sorted() روی 10 took 0.5450385000003735 seconds
sorted() روی 100 took 0.9972869999996874 seconds
sorted() روی 1000 took 10.934083999999984 seconds
____________________________________________________
sort() روی 10 took 0.4839348999998947 seconds
sort() روی 100 took 0.5398832000000766 seconds
sort() روی 1000 took 1.3094285000001946 seconds
برای 10 عنصر، زمان عملاً یکسان است – ~ 0.5 ثانیه. با این حال، به محض اینکه با 100 عنصر، sort()
طول می کشد نیم زمان مرتب کردن همان لیست است. در نهایت، در 1000 عنصر، sorted()
تقریبا طول می کشد ده برابر بیشتر زمان محاسبه به عنوان sort()
میکند.
هرچه مجموعه داده ای که با آن کار می کنید بزرگتر باشد – مزایای بیشتری با استفاده از آن به دست خواهید آورد sort()
به جای «sorted()، اگر این کار را نکنید نیاز یک مرتب سازی نامناسب
نتیجه
در این راهنمای کوتاه – نگاهی به روش مرتبسازی فهرست در پایتون با کمک انداختهایم sort()
و sorted()
.
سپس مرتبسازی را بهجای صعودی به ترتیب نزولی بررسی کردهایم، و همچنین مرتبسازی متفاوتی را تنظیم کردهایم. key
، از جمله نوشتن یک روش مرتب سازی سفارشی.
در نهایت، ما این دو روش را محک زده ایم و روش عملکرد آنها را با افزایش اندازه ورودی بررسی کرده ایم.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-07 04:33:05