Bu bölümde öğrendiğimiz sözlük adlı veri tipi sırasız bir veri tipidir. Peki, bu ne demek?
İsterseniz bunun ne demek olduğunu örnekler üzerinden anlatmaya çalışalım.
Hatırlarsanız liste ve demetlerin öğelerine tek tek şu şekilde erişiyorduk:
Liste ve demetlerde öğeleri sıralarına göre çağırabiliyoruz. Çünkü liste ve demetler sıralı veri tipleridir. Yani liste ve demetlerdeki öğelerin her birinin bir sırası vardır. Ancak sözlükler öyle değildir. Sözlüklerde herhangi bir sıra kavramı bulunmaz. Mesela şu örneğe bakalım:
Gördüğünüz gibi, öğeler tanımladığımız sırada görünmüyor.
Ancak bazı durumlarda, bir sözlük yapısı içinde tanımladığınız öğelerin sırasını korumanız gerekebilir. Örneğin şöyle bir personel kaydı oluşturduğumuzu düşünelim:
Burada, çalışanları işe giriş tarihlerine göre sıraladık. Ancak bu sözlüğü ekrana yazdırdığımızda bu sıra bozulacaktır:
Gördüğünüz gibi, işe en son giren kişi Selindi. Ama çıktıda bu kişi en başta görünüyor. Dediğimiz gibi, bu durumun sebebi sözlüklerin sırasız bir veri tipi olmasıdır.
İşte eğer herhangi bir şekilde sözlük yapısı içinde tanımladığınız öğelere, bu öğeleri tanımladığınız sıra ile erişmeniz gerekirse Pythondaki başka bir araçtan yararlanacaksınız. Bu özel aracın adı OrderedDict.
OrderedDict, collections adlı bir modül içinde yer alır. Biz henüz modül konusunu işlemedik. Ama Python programlama dilinde şimdiye kadar öğrendiklerimiz sayesinde biraz sonra anlatacaklarımızı rahatlıkla anlayabilecek kadar Python bilgisine sahibiz. O halde hemen örneğimizi verelim
Hatırlarsanız, sayılar konusundan bahsederken, iki tam sayı arasındaki bir bölme işleminin sonucunun küsuratsız olacağını, yani bu bölme işleminin sonucunun da bir tam sayı olacağını öğrenmiştik:
Normal şartlar altında 5 sayısını 2ye böldüğümüzde 2.5 sayısını elde ederiz. Ama bölme işlemine giren 5 ve 2 sayıları birer tam sayı olduğu için, bölme işleminin sonucu da tam sayı oluyor. Eğer bölme işleminde ondalık kısımları da görmek istersek şöyle bir kod yazabiliyorduk:
Ya da şöyle bir yol takip edebiliyorduk:
Gördüğünüz gibi, burada __future__ adlı bir modül içindeki division adlı bir aracı kullandık. Aynı şekilde Pythondaki sıralı sözlüklerden faydalanabilmek için de bir modül içindeki başka bir aracı kullanacağız. Dikkatlice bakın:
Dediğimiz gibi, OrderedDict, collections adlı bir modül içinde yer alır. İşte biz de yukarıdaki satır yardımıyla bu modülün içindeki OrderedDict adlı aracı kodlarımızın içine aktardık. Böylece bu aracı kodlarımızda kullanabileceğiz.
Sıralı sözlükleri şöyle tanımlıyoruz:
Gördüğünüz gibi, sıralı sözlükler bir liste içindeki iki öğeli demetler şeklinde tanımlanıyor. Bu demetlerdeki ilk öğe sözlük anahtarlarını, ikinci öğe ise sözlük değerlerini temsil ediyor. Yalnız bu tanımlama şekli gözünüze biraz uğraştırıcı görünmüş olabilir. Eğer öyleyse, sıralı sözlükleri şu şekilde de tanımlayabilirsiniz:
Önce boş bir sıralı sözlük oluşturalım:
Şimdi bu sıralı sözlüğe öğeleri teker teker ekleyelim:
Gördüğünüz gibi, bu biçim normal sözlüklere benziyor. Şimdi personeli ekrana yazdıralım:
Bu çıktıya baktığımızda, öğelerin aynen bizim tanımladığımız sırada olduğunu görüyoruz.
Sıralı sözlükler, normal sözlüklerle aynı metotlara sahiptir. Dolayısıyla yukarıdaki sıralı sözlük üzerinde şu işlemleri yapabiliriz:
Sıralı sözlüklerin programcılık maceranız boyunca çok işinize yarayacağından emin olabilirsiniz. Hatta özellikle grafik arayüz geliştirirken bu yapının epey işinize yaradığını göreceksiniz.
Böylelikle Pythonda Listeler, Demetler, Sözlükler ve Sıralı Sözlükler konusunu bitirmiş olduk. Bu konuyu sık sık tekrar etmek, hiç olmazsa arada sırada göz gezdirmek bazı şeylerin zihnimizde yer etmesi açısından oldukça önemlidir.
İsterseniz bunun ne demek olduğunu örnekler üzerinden anlatmaya çalışalım.
Hatırlarsanız liste ve demetlerin öğelerine tek tek şu şekilde erişiyorduk:
Kod:
>>> liste = ["Ali", "Ahmet", "Mehmet"] >>> liste[0] 'Ali' >>> demet = ("Ali", "Ahmet", "Mehmet") >>> demet[1] 'Ahmet'
Liste ve demetlerde öğeleri sıralarına göre çağırabiliyoruz. Çünkü liste ve demetler sıralı veri tipleridir. Yani liste ve demetlerdeki öğelerin her birinin bir sırası vardır. Ancak sözlükler öyle değildir. Sözlüklerde herhangi bir sıra kavramı bulunmaz. Mesela şu örneğe bakalım:
Kod:
>>> a = {"a": 1, "b": 2, "c": 3} >>> print a {'a': 1, 'c': 3, 'b': 2}
Gördüğünüz gibi, öğeler tanımladığımız sırada görünmüyor.
Ancak bazı durumlarda, bir sözlük yapısı içinde tanımladığınız öğelerin sırasını korumanız gerekebilir. Örneğin şöyle bir personel kaydı oluşturduğumuzu düşünelim:
Kod:
>>> personel = {'Ahmet': '19.01.2013', 'Mehmet': '21.03.2013', ... 'Selin': '30.06.2013'}
Burada, çalışanları işe giriş tarihlerine göre sıraladık. Ancak bu sözlüğü ekrana yazdırdığımızda bu sıra bozulacaktır:
Kod:
>>> print personel {'Selin': '30.06.2013', 'Ahmet': '19.01.2013', 'Mehmet': '21.03.2013'}
Gördüğünüz gibi, işe en son giren kişi Selindi. Ama çıktıda bu kişi en başta görünüyor. Dediğimiz gibi, bu durumun sebebi sözlüklerin sırasız bir veri tipi olmasıdır.
İşte eğer herhangi bir şekilde sözlük yapısı içinde tanımladığınız öğelere, bu öğeleri tanımladığınız sıra ile erişmeniz gerekirse Pythondaki başka bir araçtan yararlanacaksınız. Bu özel aracın adı OrderedDict.
OrderedDict, collections adlı bir modül içinde yer alır. Biz henüz modül konusunu işlemedik. Ama Python programlama dilinde şimdiye kadar öğrendiklerimiz sayesinde biraz sonra anlatacaklarımızı rahatlıkla anlayabilecek kadar Python bilgisine sahibiz. O halde hemen örneğimizi verelim
Hatırlarsanız, sayılar konusundan bahsederken, iki tam sayı arasındaki bir bölme işleminin sonucunun küsuratsız olacağını, yani bu bölme işleminin sonucunun da bir tam sayı olacağını öğrenmiştik:
Kod:
>>> 5/2 2
Normal şartlar altında 5 sayısını 2ye böldüğümüzde 2.5 sayısını elde ederiz. Ama bölme işlemine giren 5 ve 2 sayıları birer tam sayı olduğu için, bölme işleminin sonucu da tam sayı oluyor. Eğer bölme işleminde ondalık kısımları da görmek istersek şöyle bir kod yazabiliyorduk:
Kod:
>>> 5.0 / 2.0 2.5
Ya da şöyle bir yol takip edebiliyorduk:
Kod:
>>> from __future__ import division >>> 5/2 2.5
Gördüğünüz gibi, burada __future__ adlı bir modül içindeki division adlı bir aracı kullandık. Aynı şekilde Pythondaki sıralı sözlüklerden faydalanabilmek için de bir modül içindeki başka bir aracı kullanacağız. Dikkatlice bakın:
Kod:
>>> from collections import OrderedDict
Dediğimiz gibi, OrderedDict, collections adlı bir modül içinde yer alır. İşte biz de yukarıdaki satır yardımıyla bu modülün içindeki OrderedDict adlı aracı kodlarımızın içine aktardık. Böylece bu aracı kodlarımızda kullanabileceğiz.
Sıralı sözlükleri şöyle tanımlıyoruz:
Kod:
>>> personel = OrderedDict([("Ahmet", "19.01.2013"), ... ("Mehmet", "21.03.2013"), ("Selin", "30.06.2013")])
Gördüğünüz gibi, sıralı sözlükler bir liste içindeki iki öğeli demetler şeklinde tanımlanıyor. Bu demetlerdeki ilk öğe sözlük anahtarlarını, ikinci öğe ise sözlük değerlerini temsil ediyor. Yalnız bu tanımlama şekli gözünüze biraz uğraştırıcı görünmüş olabilir. Eğer öyleyse, sıralı sözlükleri şu şekilde de tanımlayabilirsiniz:
Önce boş bir sıralı sözlük oluşturalım:
Kod:
>>> personel = OrderedDict()
Şimdi bu sıralı sözlüğe öğeleri teker teker ekleyelim:
Kod:
>>> personel["Ahmet"] = "19.01.2013" >>> personel["Mehmet"] = "21.03.2013" >>> personel["Selin"] = "30.06.2013"
Gördüğünüz gibi, bu biçim normal sözlüklere benziyor. Şimdi personeli ekrana yazdıralım:
Kod:
>>> print personel OrderedDict([('Ahmet', '19.01.2013'), ('Mehmet', '21.03.2013'), ('Selin', '30.06.2013')])
Bu çıktıya baktığımızda, öğelerin aynen bizim tanımladığımız sırada olduğunu görüyoruz.
Sıralı sözlükler, normal sözlüklerle aynı metotlara sahiptir. Dolayısıyla yukarıdaki sıralı sözlük üzerinde şu işlemleri yapabiliriz:
Kod:
>>> personel.keys() ['Ahmet', 'Mehmet', 'Selin'] >>> personel.values() ['19.01.2013', '21.03.2013', '30.06.2013'] >>> print personel.get("Sedat", "Böyle biri yok!") Böyle biri yok!
Sıralı sözlüklerin programcılık maceranız boyunca çok işinize yarayacağından emin olabilirsiniz. Hatta özellikle grafik arayüz geliştirirken bu yapının epey işinize yaradığını göreceksiniz.
Böylelikle Pythonda Listeler, Demetler, Sözlükler ve Sıralı Sözlükler konusunu bitirmiş olduk. Bu konuyu sık sık tekrar etmek, hiç olmazsa arada sırada göz gezdirmek bazı şeylerin zihnimizde yer etmesi açısından oldukça önemlidir.
