وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

Python – روش مرتب سازی لیست با sort() و sorted()

0 187
زمان لازم برای مطالعه: 5 دقیقه


در این راهنمای کوتاه، یاد بگیرید که چگونه مرتب کردن لیست در پایتون با استفاده از داخلی 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)

از آنجایی که تاپل ها بر اساس طبقه بندی می شوند کلید، این لیست از تاپل ها از نظر واژگانی و بر اساس رشته هایی که به عنوان کلید استفاده می شوند مرتب شده اند.

پیشنهاد می‌کنیم بخوانید:  روش قالب‌بندی شماره به‌عنوان رشته ارز در جاوا اسکریپت، قالب‌بندی دستی یک عدد به‌عنوان رشته ارز می‌تواند خسته‌کننده باشد. process. اگرچه اغلب اوقات می توان این کار را در چند خط کد انجام داد، تمرین خوبی است که به جای اینکه خودتان آن را کد سختی کنید، از یک هنجار استاندارد شده پیروی کنید، به علاوه نوشتن آن برای توسعه دهنده بسیار آسان تر است.

مرتب سازی لیست تاپل ها با کلید سفارشی

برای تغییر آیتم بر اساس روی کدام تاپل ها بدون تغییر تاپل ها مرتب می شوند خودشان – شما می توانید هر مورد را در یک تاپل به جای آن به عنوان مشخص کنید 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

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید