12 Nisan 2010 Pazartesi

R.I.P. Run For Osman

3


Orta Doğu Teknik Ünivesitesi Bilgisayar Topluluğu'nun düzenlediği programlama yarışmasında finale kaldık fakat Run for Osman'a nazarımız değdi ve şampiyon at sonuçların açıklanmasından 2 gün önce kalp krizi geçirerek öldü.  Yarışmadaki grubumuzun isminin gerçek sahibi ve evdeki 'VUHAHAHA Run for Osman haa' şeklindeki espirilerin nedeni, ilham kaynağımız ata veda ettik.  Artık finalde onun için yarışacağız. Run for Run for Osman

8 Nisan 2010 Perşembe

Python 1 Satırda QuickSort

1

İnternette dolaşırken 3 satırlık bir quicksort fonksiyonuna rastladım. Python'un list comprehension'ının gücünü göstermesi açısından güzel bir örnek fakat bu kodu gerçek hayatta kullanmaktan kaçının. Bunun yerine sort'u kullanın.

def qsort(L):
    if len(L) <= 1: return L
    return qsort( [lt for lt in L[1:] if lt < L[0]] ) + [L[0]] + qsort( [ge for ge in L[1:] if ge >= L[0]] )

Aslında bunu daha da kısaltmak mümkün:) Python'da and ve or operatörleri sadece boolean tipinde veri döndürmezler. Bu operatörler işlenilen son değeri döndürürler. Bu özelliği 2. ve 3. satırları birleştirmek için kullanabiliriz. Ayrıca fonksiyon tanımını bir lambda ifadesi olarak belirtirsek kodu tek bir satırda yeniden yazabiliriz:

qsort = lambda L: (len(L)>1 and qsort( [lt for lt in L[1:] if lt < L[0]] ) + [L[0]] + qsort( [ge for ge in L[1:] if ge >= L[0]]) ) or L 

7 Nisan 2010 Çarşamba

Python Sıralama İpuçları

0

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)