Ders 22
3.3.3 - Sözlük Tipi Verilere Uygulanabilen Metotlar
Sözlükler, öntanımlı len() metodunu destekler. Örnek:
# ispanyolca adlı sözlük yukarıda oluşturulmuştu
print (len(ispanyolca)) Program Sonucu : 8
Bir başka örnek:
sx = {'ocak': 16, 'şubat': 18}
n = len(sx)
print('sx sözlüğünün uzunluğu : {0}'.format(n))
Program Sonucu : 2
Sözlük tipi metotlara uygulanan item () metodu, sözlüğün tüm elemanlarını bir topluluk içinde toplar ve bu topluluğu görüntüler. Örnekler:
q = {('Istanbul', 1) :'Beşiktaş', ('Istanbul', 2): 'Kadıköy', ('Istanbul', 3): 'Bakırköy', ('Istanbul', 4): 'Adalar'}
print(q.items())
Program Sonucu : dict_items([(('Istanbul', 1), 'Beşiktaş'), (('Istanbul', 4), 'Adalar'), (('Istanbul', 2), 'Kadıköy'), (('Istanbul', 3), 'Bakırköy')])
data = {0.25 : 16, 0.50 : 20, 0.75 : 40}
print(data.items())
Program Sonucu : dict_items([(0.25, 16), (0.5, 20), (0.75, 40)])
Sözlüklere uygulanan items() metodu, anahtar değeri tekli olsun, çoklu olsun, sözlükteki tüm elemanları bir topluluk içinde bir liste olarak geri döndürüyor. Bu topluluğun tek elemanı, sözlüğün tüm anahtar: değer verilerini eleman olarak içeren bir listedir. Bu listenin elemanlarına indisleri ile doğrudan erişim olanağı yoktur. Örnek:
q = {('Istanbul', 1) :'Beşiktaş', ('Istanbul', 2): 'Kadıköy', ('Istanbul', 3): 'Bakırköy', ('Istanbul', 4): 'Adalar'}
qt = q.items() # qt tek elemanlı bir topluluktur.
qtl= qt[1] # qtl tüm sözlük elemanlarını içeren bir listedir.
print(qtl)
Program Sonucu : TypeError Traceback (most recent call last) <ipython-input-34-6275969c9f7a> in <module>() 3 qt = q.items() # qt tek elemanlı bir topluluktur. 4 ----> 5 qtl= qt[1] # qtl tüm sözlük elemanlarını içeren bir listedir. 6 7 print(qtl) TypeError: 'dict_items' object does not support indexing
Sözlüklere uygulanan items() metodunun geri döndürdüğü koleksiyonun elemanlarına indisleri ile erişim sağlanamasının nedeni, bu koleksiyonun,"görüntü (view)" olarak adlandırılan bir tipte olmasıdır. Görüntü tipleri sadece sonucun görüntülenmesi için oluşturulurlar. Bu tipi koleksiyonlar küme (set) tipindedir ve kümelere uyulanan metotlar ugulanarak elemanlarına erişilebilirler. Bu yöntemler belirli değerlerin belirli bir sözlükte olup olmadığı sorgulanabilir. Bu metotları, kümeleri incelediğimizde, görüntü kümelerine de uygulayarak sonuçları alabileceğiz.
Buna rağmen, items() metodunun geri döndürdüğü koleksiyon, for in döngüleri ile iterasyon yapılmasına uygundur ve bu yöntemle sözlük elemanlarına erişilebilir. Örnekler:
for item in q.items():
print(item[0],item[1])
Program Sonucu : ('Istanbul', 3) Bakırköy
('Istanbul', 4) Adalar
('Istanbul', 1) Beşiktaş
('Istanbul', 2) Kadıköy
for item in q.items():
print(item[0][0],item[0][1],item[1])
Program Sonucu : Istanbul 3 Bakırköy
Istanbul 4 Adalar
Istanbul 1 Beşiktaş
Istanbul 2 Kadıköy
Sözlük anahtarlarının görüntülenmesi için keys() metodu uygulanabilir. Örnek:
q = {('Istanbul', 1) :'Beşiktaş', ('Istanbul', 2): 'Kadıköy', ('Istanbul', 3): 'Bakırköy', ('Istanbul', 4): 'Adalar'}
qkeys = q.keys() # qt sözlüğünün anahtar değerlerinin görüntü kümesi
print(qkeys
Program Sonucu : dict_keys([('Istanbul', 1), ('Istanbul', 4), ('Istanbul', 2), ('Istanbul', 3)])
Sonuç, sözlüğün tüm anahtarlarının görüntüsünü içeren bir görüntü kümesidir. Bu kümenin erişim metotlarını, kümeler ile birlikte inceleyeceğiz. Buna rağmen bu koleksiyon for in döngüleri ile taranmaya uygundur. Örnek:
q = {('Istanbul', 1) :'Beşiktaş', ('Istanbul', 2): 'Kadıköy', ('Istanbul', 3): 'Bakırköy', ('Istanbul', 4): 'Adalar'}
qkeys = q.keys() # qt sözlüğünün anahtar değerlerinin görüntü kümesi
for anahtar in q.keys():
if anahtar[1]<4:
print(anahtar[0], anahtar[1])
Program Sonucu : Istanbul 3
Istanbul 1
Istanbul 2
Öntanımlı del metodu, bellekteki bir veriyi bellekten kaldırır. Örnekler:
sx = {'ocak': 16, 'şubat': 18}
del(sx)
print(sx)
Program Sonucu : NameError Traceback (most recent call last)
<ipython-input-33-b48448a69a43> in <module>()
1 sx = {'ocak': 16, 'şubat': 18}
2 del sx
----> 3 print(sx)
NameError: name 'sx' is not defined
sx = {'ocak': 16, 'şubat': 18}
del sx['ocak']
print(sx)
Program Sonucu : {'şubat': 18}
Öntanımlı fromkeys() metodu, hash edilebilen bir koleksiyondan yani float, frozenset, int, str, ve hash edilebilen toplulukların elemanlarını anahtar olarak kullanarak, sözlükler oluşturan, son derece yararlı bir metottur. Kullanılışı,
sözlük.fromkeys(s ,v)
şeklindedir. Burada,
Örnek:
qs = ('Ocak','Şubat', 'Mart', 'Nisan')
sözlük ={}
sözlük = sözlük.fromkeys(qs, 0)
print(sözlük)
Program Sonucu : {'Mart': 0, 'Şubat': 0, 'Ocak': 0, 'Nisan': 0}
Bundan sonra, elemanlara değer vermek için sözlük['Ocak'] = 19 şeklinde bir program adımı yeterli olacaktır.
Öntanımlı get(k) metodu, bir sözlükte bulunan k anakatarına karşı gelen değeri döndürür. Eğer, anahtar sözlükte bulunamazsa, None değeri görüntülenir. Örnek,
sözlük['Ocak'] = 18
print(sözlük.get('Ocak'))
Program Sonucu : 18
Benzer metot, sözlük.get(k, v) metodu, yine bir sözlükte, k anahtarına karşı gelen değeri döndürür. Fakat burada, eğer belirtilen anahtar sözlükle bulunamazsa, kullanıcının tanımladığı, bir mesaj görüntülenir. Örnek:
print(sözlük.get('Temmuz', 'Bu veri listede yok '))
Program Sonucu : Bu veri listede yok
Öntanımlı clear() metodu, bir sözlüğün tüm elemanlarını siler. Örnek,
sZ1 = {"Pazar" : 11, "Pazartesi" : 23, "Salı" :12, "Çarşamba": 12, "Perşembe" : 23, "Cuma" : 35, "Cumartesi" : 11}
sZ1.clear()
print (sZ1)
Program Sonucu : {}
Öntaımlı copy() metodu, sözlüğün sığ kopyasını başka bir değişkene aktarır. Kullanım yöntemi, aşağıdaki programda görülebilir.
sZ1 = {"Pazar" : 11, "Pazartesi" : 23, "Salı" :12, "Çarşamba": 12, "Perşembe" : 23, "Cuma" : 35, "Cumartesi" : 11}
sZ2 = sZ1.copy()
print("Orijinal Kopyalama Sonucu : \n" , "sZ1 : " , sZ1 , "\n", "sZ2 :" , sZ2)
a = {'Pazar' : 16}
sZ1.update(a)
print("sZ1 'in güncellenmesinden sonra : \n" , "sZ1 : " , sZ1 , "\n", "sZ2 :" , sZ2)
Program Sonucu : Orijinal Kopyalama Sonucu :
sZ1 : {'Cumartesi': 11, 'Pazar': 11, 'Cuma': 35, 'Perşembe': 23, 'Pazartesi': 23, 'Çarşamba': 12, 'Salı': 12}
sZ2 : {'Pazar': 11, 'Cuma': 35, 'Pazartesi': 23, 'Perşembe': 23, 'Cumartesi': 11, 'Çarşamba': 12, 'Salı': 12}
sZ1 'in güncellenmesinden sonra :
sZ1 : {'Cumartesi': 11, 'Pazar': 16, 'Cuma': 35, 'Perşembe': 23, 'Pazartesi': 23, 'Çarşamba': 12, 'Salı': 12}
sZ2 : {'Pazar': 11, 'Cuma': 35, 'Pazartesi': 23, 'Perşembe': 23, 'Cumartesi': 11, 'Çarşamba': 12, 'Salı': 12}
Sonuçlar incelendiğinde, içiçe olmayan sözlükler için, sığ kopyalamanın yeterli olduğu ve kopyalamanın değer kopyalması olarak yürüdüğü görülebilir. Kopyalama sonunda, orijinal ve kopya, birbirinden bağımsız bellek bloklarını işaret etmektedirler. Bu yüzden her iki değişken de birbirinden bağımsızdır ve birinin güncellenmesi diğerini etkilememektedir. İçiçe sözlüklerde, yani anahtar veya değeri, güncellenebilir bir koleksiyon tipi olan sözlüklerde, derin kopyalama gereklidir. Fakat bu çalışmada içiçe koleksiyon tiplerini incelemeyeceğiz.
Öntanımlı keys() fonksiyonu, bir sözlüğün anahtarlarını, values() fonksiyonu ise değerlerini döndürür. Örnek:
sZ1 = {'Cumartesi': 11, 'Pazar': 16, 'Cuma': 35, 'Perşembe': 23, 'Pazartesi': 23, 'Çarşamba': 12, 'Salı': 12}
print(sZ1.keys())
print(sZ1.values())
Program Sonucu : dict_keys(['Pazartesi', 'Çarşamba', 'Salı', 'Cumartesi', 'Cuma', 'Perşembe', 'Pazar'])
dict_values([23, 12, 12, 11, 35, 23, 16])
Bu iki metodun da çok yararlı olduklarını belirtmek kolay değil. Sözlükler, sadece anahtar veya değer değil, anahtar : değer çiftleri için bir anlam taşırlar. Örnekte, anahtar görüntüleme sırası ile değer görüntüleme sırasının aynı olduğunu belirtiyor ve bu da önemli bir bilgidir.
Öntanımlı sözlük.pop(k) metodu, sözlükteki k anahtarına karşı gelen değeri döndürür ve bu değeri anahtar k ile birlikte sözlükten siler. Eğer, incelenenen sözlükte aranılan k anahtarı bulunmazsa, KeyError hatası oluşur.
bahar = {1 : 'İlkbahar' , 2 : "Sonbahar"}
bahar.pop(2)
print(bahar)
Program Sonucu : {1: 'İlkbahar'}
Öntanımlı sözlük.pop(k, v) metodu, sözlükteki k anahtarına karşı gelen değeri döndürür ve bu değeri anahtar k ile birlikte sözlükten siler. Eğer, incelenenen sözlükte aranılan k anahtarı bulunmazsa, v ile belirtilen değeri döndürür. Örnek:
kayıtlar = {'Selim' : 25, 'Hüseyin' : 12,'Seda' : 16, 'Savaş' : 25,'Tamer' : 25,}
print(kayıtlar)
{'Selim': 25, 'Savaş': 25, 'Hüseyin': 12, 'Tamer': 25, 'Seda': 16}
print(kayıtlar.pop('Aysel' , 'Kaydı Bulunamadı'))
Program Sonucu : Kaydı Bulunamadı
Öntanımlı popitem() metodu, sözlükten geligüzel bir elamanı kaldırır ve bu elemanı geri döndürür.. Eğer sözlük boş bir sözlük ise, KeyError istisnası fırlatılır. Örnek:
kayıtlar = {'Selim' : 25, 'Hüseyin' : 12,'Seda' : 16, 'Savaş' : 25,'Tamer' : 25,}
print(kayıtlar.popitem())
print(kayıtlar)
Program Sonucu : ('Selim', 25)
{'Savaş': 25, 'Hüseyin': 12, 'Tamer': 25, 'Seda': 16}
Bir başka metot olan setdefault(k, v) metodu, aynen get () metodu gibidir. Bu metodun farkı, eğer k anahtarı ile belirtilmiş olan değer sözlükte bulunamıyorsa, k anahtarı ile ve eğer v değeri belirtilmiş ise v değeri ile yoksa None değeri ile yeni bir elemanın sözlüğe yerleştirilmesidir. Bu metot, geriye varsa v değerini, yoksa None değerini döndürür. Örnek:
kayıtlar = {'Selim' : 25, 'Hüseyin' : 12,'Seda' : 16, 'Savaş' : 25,'Tamer' : 25,}
print(kayıtlar.setdefault('Aysel' , 22))
print(kayıtlar)
Program Sonucu : 22
{'Savaş': 25, 'Aysel': 22, 'Seda': 16, 'Selim': 25, 'Hüseyin': 12, 'Tamer': 25}
Öntanımlı update() metodu, sözlük.update(a) şeklinde kullanılır. Burada a argümanı, bir sözlük olabilir, bir iterasyon yapılabilecek anahtar, değer sekansı olabilir veya sadece keyword argümanı olabilir.Bu konuda, copy() metodunda bir örnek bulunmaktadır.
3.3.4 - Varsayılan Sözlükler
Varsayılan sözlükler (default dictionaries) , collections modülünde bulunan nesnelerdir. Bu tip sözlükler, eğer sözlüklte buluınmayan bir anahtarın değeri çağrıldığında hata vermezler ve bu anahtar ile önceden belirtilen bir değeri çiftleştirerek sözlüğe eleman olarak yerleştirirler. Kullanımı,
sözlük = collections.defaultdict(a)
şeklindedir. Burada a, çağrılabilen bir nesne olmalıdır. Bu int olabilir. Çünkü int çağrıldığında, int() fonksiyonunu çağırır ve geriye 0 döndürür. En anlamlısı kendi yazacağımız bir fonksiyonun geriye döndüreceği değerin kullanılmasıdır. Bir örnek aşağıda verilmiştir.
import collections
def fc ():
return 0
xc = collections.defaultdict(fc)
x = xc['Kış']
print(xc)
Program Sonucu : defaultdict(<function fc at 0x7f2ac172e4d0>, {'Kış': 0})
3.3.5 - Sıralı Sözlükler
Sözlükler, varsayılan olarak sıralı değillerdir. Sırasız olma özelliği, doğal olarak varsayılan özellik kabul edilmiştir. Sözlükler statil değil , dinamik nesnelerdir ve sık değişebilir güncelleştirilebilirler. Sıralanmış bir sözlük, güncelleştirlince, suarsı bozulabilir. Güncelleştirmeden sonra sırası bozulan bir sözlüğün yeniden sıralanması gerekir ve bu sürekli sıralama işlemleri, bigisayarrın sistem kaynaklarını zorlar. Bu nedenle, çok gerekli olmadıkça sözlüklerin sıralanmalarının yapılmaması akıllıca bir seçim olabilir.
Bazı durumlarda ise, sözlükler tamamen statik durumdadır. Örnek olarak, belirli bir deney süreci içinde okumalar, bir sözlükte toplanmış olsun, deney bitince, artık yeni okuma şansı kalmayacağından, sözlüğe yeni eleman ekleme şansı da kalmayacaktır. Bu tip statik sözlüklerin sıralanması, verilerin izlenme kolaylığının sağlanması açısından yararlı olacaktır.
Python programlama dilinin collections modülünde tanımlı OrderedDict() metodu, eleman sırası, veri giriş sırası olan sözlükler oluşturulmasına olanak sağlar. Örnek:
import collections
listgen = [('Balık', 246), ('Japon', 554) , ('Uçuk', 166), ('Hafız', 332)]
sabitSz = collections.OrderedDict(listgen)
print(sabitSz)
Program Sonucu : OrderedDict([('Balık', 246), ('Japon', 554), ('Uçuk', 166), ('Hafız', 332)])
Sonuçtan da görüldüğü gibi, yaratılan sözlük, koleksiyon listgen ile aynı sıralamaya sahitir. Bu sıralamayı değiştirmek için, bir elemanı iptal edip,
del sabitSz['Balık']
sözlük güncellenir ve eleman listenin sonuna kaydırılmış olur.
sabitSz.update({'Balık' : 246})
print(sabitSz)
Program Sonucu : OrderedDict([('Japon', 554), ('Uçuk', 166), ('Hafız', 332), ('Balık', 246)])
Bu sözlüğün anahtarlarının sıralanmış listesi,
xz = sorted(sabitSz)
print(xz)
Program Sonucu : ['Balık', 'Hafız', 'Japon', 'Uçuk']
şeklinde elde edilebilir. Bunun x, y değerlerindeki deney noktalarının gözden geçirilmesinde, çok yararlı olabileceği açıktır. Nihayet tam sıralanmış bir sözlük,
xxz = collections.OrderedDict(sorted(sabitSz.items()))
print(xxz)
Program Sonucu : OrderedDict([('Balık', 246), ('Hafız', 332), ('Japon', 554), ('Uçuk', 166)])
şeklinde elde edilir. Bu sözlükten her eleman çıkarılmasında veya her eleman eklenmesinde, sıralama bozulabileceğinden, yeniden sıralanma yapılması gerekli olacaktır.