7 Nisan 2010 Çarşamba

Python Sıralama İpuçları

Python'da sıralama yapmak istediğiniz  listeniz sayısal olarak değeri olan veri tiplerinden (sayılar,stringler) oluşuyorsa bu listeyi liste.sort() ile sıralamanız kolaydır.

Farklı veri tiplerinden oluşan bir listeyi sıralamak biraz daha farklı bir durum fakat Python'un sort'unun gücünden burada da faydalanmalıyız. Mümkün olduğunca(her zaman) bir sıralama algoritması yazmaktan kaçınmak pek çok açıdan yararlı. En önemlisi sort metodunun performanslı olması. Python'un sıralaması yıllarca Python ile birlikte gelişen,  farklı durumlar için (değişik boyutlu listeler,  sıralanmışlık derecesi çok ya da az olan listeler, ters sıralanmış listeler) performanslı, teknik açıdan anlaşılması güç yaklaşık 1200 satır C kodundan oluşan bir mergesort algoritması ve her durumda kullanılması geliştiricileri tarafından da tavsiye ediliyor.

Python'un sort metodunu artık her koşulda kullanmak istiyoruz. Bunu farklı veri tipinden oluşan listeler için kolay ve hızlı bir şekilde kullanmak için "Decorate-Sort-Undecorate" yöntemini kullanırız. "Decorate" listeyi sort metodu için uygun hale getirmek, "Sort" sıralama işlemini gerçekleştirmek, "Undecorate" ise listeyi tekrar eski görünümüne döndürmek anlamına geliyor.  Burada bilmemiz gereken bir diğer nokta sort metodu arraylerden oluşan bir listeyi sıralarken arraylerin ilk elemanlarına göre karşılaştırma yapar. Örneğin [ (1,4,2) , (0,4,5), (3,0,"b") ] için sort metodu listeyi şu şekle sokar: [(0,4,5),(1,4,2),(3,0,"b")].  O halde "Decorate"den kastımız listeyi sıralanmasında karşılaştırılmasını istediğimiz değerler arraylerin başına gelecek şekilde değiştirmektir: [(deger1,nesne1),(deger2,nesne2),....., (degerN,nesneN)]

Problem:
Nesnelerden oluşan bir listeyi nesnelerin bir özelliğine göre sıralamak istiyoruz.

Decorate-Sort-Undecorate(DSU) çözümü:

nesneler = [nesne1,nesne1,nesne3,nesne4]
decorated_liste = [(nesne.ozellik, nesne) for nesne in nesneler] # decorate 
decorated_liste.sort()                                           # sort
nesneler = [ array[1] for array in decorated_liste ]             # undecorate
Problem 2:
Dictionary(Sözlük) tipindeki bir nesnemizi sözlüğün anahtar verilerine göre sıralamak istiyoruz.

DSU çözümü:
Çözüm yine benzer fakat dictionary'lerin sıralanma gibi bir özelliği olmadığını unutmamalıyız. Sıralanmış değerlere yine bir liste içinden ulaşabiliriz.

sozluk = {int1:nesne1,int2:nesne2,int3:nesne3}
ogeler = sozluk.items()                    #decorate  
ogeler.sort()                              #sort 
degerler = [array[1] for array in ogeler]  #undecorate (sıralanmış nesneler listesi)

0 yorum: