Python Programlamaya Giriş 14 - Sözlük Metodları

Python Programlamaya Giriş
Author

Kaan Öztürk

Published

February 3, 2018

Python’daki veri tiplerini daha önce kısaca ele almıştık; bir önceki bölümde de liste tipine ait metodların kullanımını örneklerle incelemiştik. Bu yazıda sözlük tipine ait olan metodları örneklerle açıklıyoruz. Bundan sonraki bölümlerde dize ve küme tiplerine ait metodları inceleyeceğiz.

Dizinin bütün yazılarına erişmek için Python Programlamaya Giriş kategorimize bakabilirsiniz. Bu dizideki yazılar ayrıca Jupyter defterleri halinde GitHub depomuzda da mevcut.

Sözlükler, listeler gibi, birden fazla elemanı bir araya toplayan yapılardır. Listelerden farkları sıralı nesne olmamalarıdır. Bir listenin indeksleri üzerinden doğal bir sırası varken, sözlüklerin elemanlarında doğal bir sıralama mevcut değildir.

Bir sözlük birleşmeli dizi (associative array) olarak anılan bir veri yapısıdır. Bu yapıdaki her eleman bir anahtar-değer (key-value) çiftinden oluşur. Belli bir değere ulaşmak için o değere ait tekil anahtarı kullanmak gerekir. Bu anahtar bir sayı, dize veya çokuz olabilir.

telefon["kaan"] == "216 123 4567"
sıcaklık[(24.345, 41.243)] == 21.2

Listelerde elemanlar sıfırdan başlayarak tamsayılarla indekslenirken, sözlük elemanlarını anahtarlarla indekslenir. Bu anlamda sözlükler listelerden daha geneldirler.

Sözlük yaratma

Diyelim bir kişinin ismini ve yaşını barındıran bir sözlük oluşturacaksınız. Bu sözlüğü Python’da oluşturmanın dört değişik yolu vardır.

  1. Doğrudan bir sözlük nesnesi yaratmak
D = {"isim" : "Ali", "yaş" : 45}
D
{'isim': 'Ali', 'yaş': 45}
  1. Boş bir sözlük yarattıktan sonra anahtar ve değerleri tek tek eklemek:
D = {}
D["isim"] = "Ali"
D["yaş"] = 45
D
{'isim': 'Ali', 'yaş': 45}
  1. dict fonksiyonunu isimli parametrelerle kullanmak:
D = dict(isim="Ali", yaş=45)
D
{'isim': 'Ali', 'yaş': 45}
  1. dict fonksiyonuna (anahtar, değer) çiftleri dizisi vermek:
D = dict([("isim","Ali"),("yaş",45)])
D
{'isim': 'Ali', 'yaş': 45}

Bu sonuncu yöntem genellikle, anahtarlar ve değerler ayrı ayrı listelerde verilmişse, onları zip fonksiyonuyla birleştirilerek kullanılır.

anahtarlar = ['isim', 'yaş']
degerler = ['Ali', 45]
D = dict( zip(anahtarlar, degerler) )
D
{'isim': 'Ali', 'yaş': 45}

len, del, in

Bir nesnenin içindeki eleman sayısını veren len fonksiyonu, bir nesneyi veya elemanını silen del komutu, belirli bir elemanın mevcut olup olmadığını veren in işlemi sözlüklerde de kullanılabilir.

D = {'bir': 1, 'iki': 2.0, 'pi': 3.14159}
len(D)
3
"bir" in D
True

in komutu sadece anahtarlar üzerinde tarama yapar. Değerler arasında belli bir değer bulunup bulunmadığını bulmakta kullanılmaz.

1 in D
False
del D["bir"]
D
{'iki': 2.0, 'pi': 3.14159}

Sözlük metodları

Bir sözlük nesnesine ait metodları dir fonksiyonuyla görebiliriz.

dir(dict)
['__class__',
 '__contains__',
 '__delattr__',
 '__delitem__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'clear',
 'copy',
 'fromkeys',
 'get',
 'items',
 'keys',
 'pop',
 'popitem',
 'setdefault',
 'update',
 'values']

Başında ve sonunda altçizgi olan metodlar nesne içi kullanım içindir.

Sözlükteki bütün maddeleri silmek

clear metodu ile bir sözlükteki bütün anahtar-değer çiftleri silinebilir.

D = {'bir': 1, 'iki': 2.0, 'pi': 3.14159}
D.clear()
D
{}

Sözlüğün kopyasını çıkarmak

Bazen bir sözlükteki orijinal bilgileri değiştirmeden, bir kopya üzerinde işlemler yapmanız gerekebilir. Bir sözlüğün kopyasını copy metoduyla elde edebilirsiniz.

D = {'bir': 1, 'iki': 2.0, 'pi': 3.14159}
D2 = D.copy()
D2
{'bir': 1, 'iki': 2.0, 'pi': 3.14159}

Bundan sonra D2’de yapacağımız değişiklikler D’yi etkilemez.

D2["bir"] = "uno"
print("D =",D)
print("D2 =",D2)
D = {'bir': 1, 'iki': 2.0, 'pi': 3.14159}
D2 = {'bir': 'uno', 'iki': 2.0, 'pi': 3.14159}

İki sözlüğü birleştirmek

Sözlüklerin update metodu ile varolan bir sözlüğe yeni bir sözlükten anahtar-değer çiftleri ekleyebilirsiniz. Aynı anahtara sahip iki değer varsa, eskisi yenisiyle değiştirilir. Bu metod nesne içi (in-place) değişiklik yapar.

telefonlar = {"Ali": 3762, "Zeynep": 8249, "Mehmet": 2652}
telf_2 = {"Fatma": 9212, "Deniz": 1129, "Mehmet": 1212}
telefonlar.update(telf_2)
telefonlar
{'Ali': 3762, 'Deniz': 1129, 'Fatma': 9212, 'Mehmet': 1212, 'Zeynep': 8249}

Sözlüklerden liste üretmek

Bazen bir sözlükteki elemanları teker teker işlemek için bir döngü kurmak isteyebilirsiniz. Ancak sözlükler sıralı nesne olmadıkları için for döngüsü ile kullanılamazlar. Bir sözlüğün içeriğini iterasyona uygun bir biçime getirmek için dict.items metodunu kullanmalıyız.

telefonlar = {"Ali": 3762, "Zeynep": 8249, "Mehmet": 2652}
for isim,tel in telefonlar.items():
    print("Adı: {}, İç Hat: {}".format(isim,tel))
Adı: Ali, İç Hat: 3762
Adı: Zeynep, İç Hat: 8249
Adı: Mehmet, İç Hat: 2652
list(telefonlar.items())
[('Ali', 3762), ('Zeynep', 8249), ('Mehmet', 2652)]

Dikkat: Yazdığımız döngüde elemanları sözlüğe verdiğimiz orijinal sırada geri aldık. Ama bunun her zaman böyle olacağının garantisi yok. Sözlüklerde herhangi bir varsayılan sıra olmaz. Yapacağınız işlem belli bir sıralama gerektiriyorsa, işlemden önce elemanlar listesinde açık komutla sıralama yapın.

telefonlar = {"Ali": 3762, "Zeynep": 8249, "Mehmet": 2652}
for isim,tel in sorted(telefonlar.items()):
    print("Adı: {}, İç Hat: {}".format(isim,tel))
Adı: Ali, İç Hat: 3762
Adı: Mehmet, İç Hat: 2652
Adı: Zeynep, İç Hat: 8249

Sadece anahtarlardan oluşan bir liste elde etmek için dict.keys metodunu kullanırız.

list(telefonlar.keys())
['Ali', 'Zeynep', 'Mehmet']

Sadece değerlerden oluşan bir liste için dict.values metodu kullanılır.

list(telefonlar.values())
[3762, 8249, 2652]

Eğer iki çağrı arasında sözlükte bir değişiklik yapılmadıysa, keys ve values metodlarıyla elde ettiğimiz listelerin elemanları karşılıklı olarak sözlükteki mevcut anahtar-değer çiftlerine denk gelir. Böylece zip ile bu listeleri birleştirerek orijinal sözlüğü elde edebiliriz.

isimler = list(telefonlar.keys())
telnolar = list(telefonlar.values())
dict(zip(isimler,telnolar))
{'Ali': 3762, 'Mehmet': 2652, 'Zeynep': 8249}

Elemanlara erişmek

Bir D sözlüğünde saklanan bir değere erişmenin en basit yolu D[anahtar] komutunu kullanmak. Fakat anahtar referansı sözlükte tanımlı değilse bir hata mesajı çıkar, bu da programınızın akışınızı bozabilir.

telefonlar = {"Ali": 3762, "Zeynep": 8249, "Mehmet": 2652}
telefonlar["Ali"]
3762
telefonlar["Kaan"]
KeyError: 'Kaan'

Verilen anahtarın sözlükte bulunmaması durumunda varsayılan bir değer döndürülmesini istiyorsanız, get metodunu kullanabilirsiniz. D.get(k, d) ifadesi, k anahtarı sözlükte varsa D[k] değerini, yoksa varsayılan d değerini geri verir.

for isim in ["Ali","Kaan"]:
    print("{} telefonu {}".format(isim, telefonlar.get(isim, "mevcut değil")))
Ali telefonu 3762
Kaan telefonu mevcut değil

Sözlüğe yeni anahtarlar eklemek

Bir D sözlüğüne yeni bir anahtar-değer çiftini dinamik olarak kolayca ekleyebiliriz.

D = {}
D["abc"] = 3
D
{'abc': 3}

Bunun başka bir yolu da setdefault metodunu kullanmaktır. Bu metod, get gibi çalışır, mevcut olmayan bir anahtar verildiğinde bir varsayılan değer döndürür. Ama get’ten farklı olarak, verilen yeni anahtarı sözlüğe ekler.

print(D.get("def",42))
print(D) # sözlük eski halinde kalır.
42
{'abc': 3}
print(D.setdefault("def",42))
print(D) # sözlüğe "def" anahtarı eklendi.
42
{'abc': 3, 'def': 42}