NECƏ YAPILIR¶

Python siyahıları, siyahını yerində dəyişdirən daxili bir list.sort () metoduna malikdir. Yenidən sıralanan siyahıdan təkrarlanan bir siyahı quran sıralanmış () quraşdırılmış funksiya da mövcuddur.

Bu sənəddə Python istifadə edərək məlumatları çeşidləmək üçün müxtəlif üsulları araşdırırıq.

Sıralama Əsasları¶

Sadə artan sıralama çox asandır: sıralanmış () funksiyasını çağırmaq kifayətdir. Yeni bir sıralanmış siyahı qaytarır:

List.sort () metodundan da istifadə edə bilərsiniz. Siyahını yerində dəyişdirir (və qarışıqlığın qarşısını almaq üçün heç birini geri qaytarmır). Adətən sıralanandan () daha az rahatdır - amma orijinal siyahıya ehtiyacınız yoxdursa, bir az daha səmərəlidir.

Digər bir fərq, list.sort () metodunun yalnız siyahılar üçün təyin edilməsidir. Bunun əksinə olaraq, sorted () funksiyası hər hansı bir təkrarlananı qəbul edir.

Əsas funksiyalar¶

Hər iki list.sort () və sorted (), müqayisə etməzdən əvvəl hər bir siyahı elementində çağırılacaq bir funksiyanı (və ya digər çağırıla bilən) təyin etmək üçün əsas parametrə malikdir.

Məsələn, hərflərə həssas olmayan simli müqayisə:

Açar parametrinin dəyəri, tək bir arqument götürən və çeşidləmə məqsədləri üçün istifadə etmək üçün bir açarı qaytaran bir funksiya (və ya digər zəng edilə bilən) olmalıdır. Bu texnika sürətlidir, çünki hər bir giriş qeydində əsas funksiya tam olaraq bir dəfə çağırılır.

Ümumi bir nümunə, obyektin bəzi indekslərini açar olaraq istifadə edərək kompleks obyektləri sıralamaqdır. Misal üçün:

Eyni texnika, atributları olan obyektlər üçün işləyir. Misal üçün:

Operator Modulunun Funksiyaları

Yuxarıda göstərilən əsas funksiya nümunələri çox yaygındır, buna görə Python, giriş funksiyalarını daha asan və daha sürətli etmək üçün rahatlıq funksiyaları təmin edir. Operator modulunda itemgetter (), attrgetter () və methodcaller () funksiyası var.

Bu funksiyalardan istifadə edərək yuxarıdakı nümunələr daha sadə və daha sürətli olur:

Operator modulunun funksiyaları bir neçə səviyyəli çeşidləməyə imkan verir. Məsələn, düzmək üçün sinif sonra yaş :

Artan və Azalan

Həm list.sort (), həm də sorted () məntiqi dəyəri olan tərs parametri qəbul edir . Azalan növləri qeyd etmək üçün istifadə olunur. Məsələn, tələbə məlumatlarını tərs yaş qaydasında əldə etmək üçün :

Sabitliyi və Kompleks Sıralamaları

Növlərin sabit olmasına zəmanət verilir. Bu o deməkdir ki, birdən çox qeyd eyni açara malik olduqda onların orijinal qaydası qorunur.

Mavi üçün iki qeydin orijinal sırasını necə saxladığına diqqət yetirin ki, ('mavi', 1) əvvəlcədən zəmanət verilsin ('mavi', 2).

Bu gözəl mülk, bir sıra çeşidləmə addımlarında kompleks çeşidlər qurmağa imkan verir. Məsələn, azalan tələbə data düzmək üçün sinif və sonra artan yaş , nə yaş sort ilk və sonra sort yenidən istifadə grade :

Bu, bir siyahı və bir dəstə sahə götürə bilən və onları birdən çox keçiddə sıralamaq üçün istifadə edə bilən bir sarğı funksiyasına çevrilə bilər.

Python -da istifadə olunan Timsort alqoritmi bir çox növləri səmərəli şəkildə yerinə yetirir, çünki bir verilənlər bazasında artıq mövcud olan hər hansı bir sifarişdən istifadə edə bilər.

Dekorasiya-çeşidləmə-bəzəmədən istifadə etməyin köhnə yolu¶

Bu deyim üç addımdan sonra Dekorasiya-Sort-Süslənmə adlanır:

Birincisi, ilkin siyahı sıralama qaydasını idarə edən yeni dəyərlərlə bəzədilmişdir.

İkincisi, bəzədilmiş siyahı sıralanır.

Nəhayət, bəzəklər silinir və yeni qaydada yalnız ilkin dəyərləri ehtiva edən bir siyahı yaradılır.

Məsələn, DSU yanaşmasını istifadə edərək şagird məlumatlarını siniflərə görə sıralamaq üçün :

Bu deyim, tuplar leksikoqrafik cəhətdən müqayisə edildiyi üçün işləyir; ilk maddələr müqayisə olunur; eynidirsə, ikinci maddələr müqayisə olunur və s.

Bütün hallarda i indeksini bəzədilmiş siyahıya daxil etmək qətiyyən vacib deyil , lakin daxil etmək iki fayda verir:

Sıralama sabitdir - iki maddənin eyni açarı varsa, onların sırası sıralanmış siyahıda saxlanılacaq.

Orijinal əşyaları müqayisə etmək lazım deyil, çünki bəzədilmiş tupların sifarişi ən çox ilk iki maddə ilə müəyyən ediləcəkdir. Məsələn, orijinal siyahıda birbaşa sıralana bilməyən kompleks ədədlər ola bilər.

Bu deyimin başqa bir adı Perl proqramçıları arasında populyarlaşdıran Randal L. Schwartzdan sonra Schwartzian çevrilməsidir.

Python çeşidlənməsi əsas funksiyaları təmin etdiyinə görə, bu texnikaya çox vaxt ehtiyac yoxdur.

Cmp Parametrindən istifadə edərək Köhnə Yol¶

Bu HOWTO -da verilən bir çox konstruksiya Python 2.4 və ya daha sonrasını qəbul edir. Bundan əvvəl sıralanmış () inşa edilmiş və list.sort () heç bir açar söz arqumenti götürməmişdir. Bunun əvəzinə, bütün Py2.x versiyaları istifadəçi tərəfindən müəyyən edilmiş müqayisə funksiyalarını idarə etmək üçün bir cmp parametrini dəstəklədi .

Py3.0 -da, cmp parametri tamamilə silindi (zənginləşdirmə və __cmp __ () sehrli metodu arasındakı ziddiyyəti ortadan qaldıran dili asanlaşdırmaq və birləşdirmək üçün daha böyük səylərin bir hissəsi olaraq).

Py2.x -də, sort müqayisə etmək üçün çağırıla bilən əlavə bir funksiyaya icazə verdi. Bu funksiya müqayisə etmək üçün iki arqument götürməli və sonra mənfi dəyərdən aşağıya, bərabər olduqda sıfıra dönməli və ya çoxdan müsbət dəyər verməlidir. Məsələn, edə bilərik:

Və ya müqayisə qaydasını dəyişdirə bilərsiniz:

Python 2.x -dən 3.x -ə kod daşıyarkən, istifadəçinin müqayisə funksiyasını təmin etməsi və bunu əsas funksiyaya çevirməsi lazım olduqda vəziyyət yarana bilər. Aşağıdakı sarğı bunu asanlaşdırır:

Bir əsas funksiyaya çevirmək üçün köhnə müqayisə funksiyasını sarın:

Python 3.2 -də, functools.cmp_to_key () funksiyası standart kitabxanadakı functools moduluna əlavə edildi.

Qəribə və Sonlar¶

Yerli məlumatları ayırmaq üçün əsas funksiya üçün locale.strxfrm () və ya müqayisə funksiyası üçün locale.strcoll () istifadə edin.

Əks parametr hələ sort sabitliyi saxlayır (bərabər düymələri ilə yazan orijinal qaydada saxlamaq belə). Maraqlıdır ki, bu effekt iki dəfə daxili reversed () funksiyasından istifadə edərək parametr olmadan simulyasiya edilə bilər:

Sıralama rutinlərinin iki obyekt arasında müqayisə apararkən __lt __ () istifadə etməsinə zəmanət verilir. Beləliklə, __lt __ () metodunu təyin edərək sinifə standart sıralama əmrini əlavə etmək asandır:

Əsas funksiyaların sıralanan obyektlərdən birbaşa asılı olması lazım deyil. Əsas funksiya xarici mənbələrə də daxil ola bilər. Məsələn, şagird qiymətləri bir lüğətdə saxlanılırsa, ayrı bir şagird adlarının siyahısını sıralamaq üçün istifadə edilə bilər: