Python veri koleksiyonlarından son olarak inceleyeceğimiz Sözlükler(Dictionaries)dir. Yapı olarak diğer programlama dillerindeki nesne veri türüne benzerdir. Süslü parantez içinde anahtar-değer ikilileri şeklinde depolanır.

Sözlükler; sıra numarasına sahip olmayan ve  her anahtarın küme içinde yalnızca bir kez bulunabildiği tekrar etmeyen veri koleksiyonlarıdır. İçindeki veriler anahtar olarak da ifade edilen değişken isimleri ile indekslenmiş olup, depoladıkları değerler değiştirilebilir.

Sözlükler de listeler gibi içerisinde her tür veriyi karışık olarak bulundurabilir.

personelBilgileri = { 
  "ad-soyad":"Mert Demir",
  "yas": 28,
  "deneyim": 6,
  "arayuzDili": "ReactJS",
  "sunucuDili": "NodeJS"
  }
print(personelBilgileri)

Çıktı:

{'ad-soyad': 'Mert Demir', 'yas': 28, 'deneyim': 6, 'arayuzDili': 'ReactJS', 'sunucuDili': 'NodeJS'}

 

Sözlükler içindeki verilere indeks olarak kullanılan anahtarlar aracılığıyla ulaşabilirsiniz;

print(personelBilgileri["arayuzDili"])

Çıktı:

ReactJS

Ayrıca, verilere get() metoduyla da erişebilirsiniz;

print("Personel Adı-Soyadı: ", personelBilgileri.get("ad-soyad"))

Çıktı:

Personel Adı-Soyadı: Mert Demir

Tabii sözlük içindeki verilere ulaşmak için kullanılan anahtarları da biliyor olmanız gerekir. Depolanan değerlere hangi anahtarlar yardımıyla ulaşabileceğinizi de keys() metodu ile öğrenebilirsiniz;

print(personelBilgileri.keys())

Çıktı:

dict_keys(['ad-soyad', 'yas', 'deneyim', 'arayuzDili', 'sunucuDili'])

Benzer şekilde sözlükte depolanan verileri de toplu olarak görmek için values() metodunu kullanabilirsiniz;

print(personelBilgileri.values())

Çıktı:

dict_values(['Mert Demir', 28, 6, 'ReactJS', 'NodeJS'])

 

Eğer sözlük içinde yer alan tüm anahtar-değer ikililerini görmek isterseniz de, items() metodundan faydalanabilirsiniz. Bu metod sözlükte yer alan tüm ikilileri bir liste içinde demet oloarak getirir.

print(personelBilgileri.items())

Çıktı:

dict_items([('ad-soyad', 'Mert Demir'), ('yas', 28), ('deneyim', 6), ('arayuzDili', 'ReactJS'), ('sunucuDili', 'NodeJS')])

 

Sözlükler içinde yer alan anahtarlar değişken adı gibi düşünülebilir ve sözlüklerde anahtarlar tekrar etmez derken kastedilen şey uygulamanızın hata vereceği değil, bir değişkene birden fazla yerde değer atandığında son atanan değeri depoladığı anlamında en son depolanan veriyi taşıyacağı anlamına gelmektedir.

personelBilgileri = { 
  "ad-soyad":"Mert Demir",
  "yas": 28,
  "deneyim": 6,
  "arayuzDili": "ReactJS",
  "sunucuDili": "NodeJS",
  "arayuzDili": "VueJS"
  }
print(personelBilgileri)

Çıktı:

{'ad-soyad': 'Mert Demir', 'yas': 28, 'deneyim': 6, 'arayuzDili': 'VueJS', 'sunucuDili': 'NodeJS'}

 

Bir sözlükte bir anahtarın(değişkenin) yer alıp almadığını öğrenmek için daha önce diğer veri koleksiyonlarında da kullandığımız if…in ifadesini kullanabilirsiniz;

if "deneyim" in personelBilgileri:
  print("Personel deneyim verisi mevcut.")

Çıktı:

Personel deneyim verisi mevcut.

 

Sözlükte bir veriyi değiştirmek için ilgili anahtara(değişkene) yeni bir değer atamak yeterlidir;

personelBilgileri["deneyim"]=8
print("Deneyim Süresi: ", personelBilgileri["deneyim"])

Çıktı:

Deneyim Süresi: 8

Ayrıca update() metodunu da kullanabilirsiniz. Bu metod parametre olarak bir sözlük içinde anhatar:değer ikilisi olarak değişikliği gerçekleştirir;

personelBilgileri.update({"sunucuDili":"Python"})
print("Kullanılan Sunucu Tabanlı Programlama Dili: ",personelBilgileri["sunucuDili"])

Çıktı:

Kullanılan Sunucu Tabanlı Programlama Dili: Python

 

Sözlüklere yeni bir veri eklemek için hem anahtarı hem de değerini tanımlamalısınız;

personelBilgileri["sehir"]="İzmir"
print(personelBilgileri)

Çıktı:

{'ad-soyad': 'Mert Demir', 'yas': 28, 'deneyim': 8, 'arayuzDili': 'VueJS', 'sunucuDili': 'Python', 'sehir': 'İzmir'}

Sözlüğe yeni veri eklemenin bir diğer yolu da az önce incelediğimiz update() metodunu kullanmaktır. Bu metod eğer anahtar(değişken) mevcutsa veriyi günceller ancak anahtar(değişken) sözlükte yoksa yeni veri olarak ekler;

personelBilgileri.update({"egitim":"ODTÜ"})
print(personelBilgileri)

Çıktı:

{'ad-soyad': 'Mert Demir', 'yas': 28, 'deneyim': 8, 'arayuzDili': 'VueJS', 'sunucuDili': 'Python', 'sehir': 'İzmir', 'egitim': 'ODTÜ'}

 

Bir sözlükteki verilere ulaşırken kullanabileceğimiz bir başka metod ise setdefault() metodudur. Bu metod sözlük içinde parametre olarak verilen anahtar bulunuyorsa değerini döndürür ancak bulunmuyorsa ikinci parametre olarak verilen değer ile sözlük içinde yeni bir anahtar-değer ikilisi oluşturur.

print(personelBilgileri)
print(personelBilgileri.setdefault("sehir","Ankara"))
print(personelBilgileri.setdefault("meslek","Matematik Mühendisi"))
print(personelBilgileri)

Çıktı:

{'ad-soyad': 'Mert Demir', 'yas': 28, 'deneyim': 8, 'arayuzDili': 'VueJS', 'sunucuDili': 'Python', 'sehir': 'İzmir', 'egitim': 'ODTÜ'}
İzmir
Matematik Mühendisi
{'ad-soyad': 'Mert Demir', 'yas': 28, 'deneyim': 8, 'arayuzDili': 'VueJS', 'sunucuDili': 'Python', 'sehir': 'İzmir', 'egitim': 'ODTÜ', 'meslek': 'Matematik Mühendisi'}

 

Sözlüklerde veri silme işlemleri de Listelerdeki pop(), clear() methodları ile del anahtar kelimesi kullanılarak gerçekleştirilmektedir. Ancak bu kez parametre olarak sıra numarası yerine anahtar kullanılmaktadır. Listeler ile benzer oldukları için burada tekrar örneklemeyeceğim ancak konunun altındaki linkte bulunan tüm örnekler arasında yer almaktadırlar.

Sözlüklerde yer alan tüm verilere ulaşmak için diğer veri koleksiyonlarında olduğu gibi döngülerden faydalanırız. Sözlükte yer alan anahtarlara(değişkenlere) ulaşmak için;

for x in personelBilgileri:
    print(x)

Çıktı:

ad-soyad
yas
deneyim
arayuzDili
sunucuDili

Gördüğünüz gibi diğer veri koleksiyonlarında direkt veriyi görüntüleyen for..in döngüsü sözlüklerde anahtarlara ulaşmaktadır. Sözlükte yer alan anahtarlara ulaşmanın bir diğer yolu da keys() metodunu kullanmaktır;

for x in personelBilgileri.keys():
    print(x)

Çıktı:

ad-soyad
yas
deneyim
arayuzDili
sunucuDili

Sözlükte yer alan verilere ulaşmak için;

for x in personelBilgileri:
    print(personelBilgileri[x])

Çıktı:

Mert Demir
28
6
VueJS
NodeJS

Sözlükte yer alan verilere ulaşmanın bir diğer yolu da values() metodunu kullanmaktır;

for x in personelBilgileri.values():
    print(x)

Çıktı:

Mert Demir
28
6
VueJS
NodeJS

Şu anda aklınıza şu soru takılabilir; biz sözlük içinde yer alan anahatarlara ve verilere sözlük_adı.keys() ve sözlük_adı.values() şeklinde zaten ulaşabiliyorduk, öyleyse bunları döngü içinde kullanmaya ne gerek var?

sözlük_adı.keys() ve sözlük_adı.values() metodları ile sadece sözlük içinde yer alan anahtar ve verileri görüntüleyebiliyoruz. Oysa döngüler ile bunlara erişerek döngü içinde görüntülemekten başka işlemler de yapabiliriz.

Sözlüklerde anahtar ve değerlerine döngü ile de ulaşabiliriz;

for x,y in personelBilgileri.items():
  print(x,": ",y)

Çıktı:

ad-soyad : Mert Demir
yas : 28
deneyim : 6
arayuzDili : VueJS
sunucuDili : NodeJS

 

Sözlüklerin yeni ve bağımsız bir kopyasını oluşturmak için daha önce Listelerde kullandığımız copy() metodunun yanı sıra dict() fonksiyonunu da kullanabilirsiniz;

personel2=personelBilgileri.copy()
personel2["ad-soyad"]="Ayberk Seven"
print("Kopyalanan personel2 verileri: ",personel2)
print(id(personel2)==id(personelBilgileri))
personel3=dict(personelBilgileri)
personel2["ad-soyad"]="İlhan Buğra"
print("Kopyalanan personel2 verileri: ",personel3)
print(id(personel3)==id(personelBilgileri))
print("Orjinal sözlük verisi: ",personelBilgileri)

Çıktı:

Kopyalanan personel2 verileri: {'ad-soyad': 'Ayberk Seven', 'yas': 28, 'deneyim': 6, 'arayuzDili': 'VueJS', 'sunucuDili': 'NodeJS'}
False
Kopyalanan personel2 verileri: {'ad-soyad': 'Mert Demir', 'yas': 28, 'deneyim': 6, 'arayuzDili': 'VueJS', 'sunucuDili': 'NodeJS'}
False
Orjinal sözlük verisi: {'ad-soyad': 'Mert Demir', 'yas': 28, 'deneyim': 6, 'arayuzDili': 'VueJS', 'sunucuDili': 'NodeJS'}

Bu şekilde kopyalanan sözlüklerin orjinal sözlükten bağımsız olduğuna ve içindeki veriler değiştirildiğinde kopya alınan sözlük verilerinin değişmediğine dikkat ediniz.

Sözlükler içinde başka sözlükleri de bulundurabilir. Bu tür sözlüklere iç içe sözlükler adı verilir. Bu sözlüklerde anahatarlara karşılık gelen veriler de birer sözlüktür.

personelBilgileri={
  "personel1":{ 
  "ad-soyad":"Mert Demir",
  "yas": 28,
  "deneyim": 6,
  "arayuzDili": "VueJS",
  "sunucuDili": "NodeJS",
  },
  "personel2": { 
  "ad-soyad":"Ayberk Seven",
  "yas": 24,
  "deneyim": 2,
  "arayuzDili": "ReactJS",
  "sunucuDili": "PHP",
  },
  "personel3": { 
  "ad-soyad":"İlhan Buğra",
  "yas": 33,
  "deneyim": 9,
  "arayuzDili": "Angular",
  "sunucuDili": "Python",
  }
}
print(personelBilgileri)
print("")

Çıktı:

{'personel1': {'ad-soyad': 'Mert Demir', 'yas': 28, 'deneyim': 6, 'arayuzDili': 'VueJS', 'sunucuDili': 'NodeJS'}, 'personel2': {'ad-soyad': 'Ayberk Seven', 'yas': 24, 'deneyim': 2, 'arayuzDili': 'ReactJS', 'sunucuDili': 'PHP'}, 'personel3': {'ad-soyad': 'İlhan Buğra', 'yas': 33, 'deneyim': 9, 'arayuzDili': 'Angular', 'sunucuDili': 'Python'}}

Aynı sözlüğü önce içteki sözlükleri oluşturup sonra bunları bir başka sözlüğün içine yerleştirerek şu şekilde de oluşturabilirdik;

personel1={ 
  "ad-soyad":"Mert Demir",
  "yas": 28,
  "deneyim": 6,
  "arayuzDili": "VueJS",
  "sunucuDili": "NodeJS",
  }
personel2= { 
  "ad-soyad":"Ayberk Seven",
  "yas": 24,
  "deneyim": 2,
  "arayuzDili": "ReactJS",
  "sunucuDili": "PHP",
  }
personel3= { 
  "ad-soyad":"İlhan Buğra",
  "yas": 33,
  "deneyim": 9,
  "arayuzDili": "Angular",
  "sunucuDili": "Python",
  }
personelBilgileri={
  "personel1":personel1,
  "personel2":personel2,
  "personel3":personel3
}
print(personelBilgileri)

 

Sözlük oluşturmak için gerekli olan anahtarları daha önce oluşturulmuş olan veri koleksiyonundan alarak sözlük oluşturmanız da mümkündür. Bunun için fromkeys() metodundan faydalanırız;

personelDegiskenleri=("ad-soyad","yas","deneyim","arayuzDili","sunucuDili")
personeller=dict.fromkeys(personelDegiskenleri)
print(personeller)
personeller1=dict.fromkeys(personelDegiskenleri,"Değer atanmamış")
print(personeller1)

Çıktı:

{'ad-soyad': None, 'yas': None, 'deneyim': None, 'arayuzDili': None, 'sunucuDili': None}
{'ad-soyad': 'Değer atanmamış', 'yas': 'Değer atanmamış', 'deneyim': 'Değer atanmamış', 'arayuzDili': 'Değer atanmamış', 'sunucuDili': 'Değer atanmamış'}

Gördüğünüz gibi eğer fromkeys() metoduna sadece anahtarları oluşturan veri koleksiyonunu parametre olarak verirseniz oluşturulan sözlüğün verileri None olmakta, ancak ikinci parametre olarak bir değer verirseniz bu değer tüm anahtarlara atanmaktadır.

 

Sözlükler ile ilgili burada yer alan ve diğer veri koleksiyonları ile ortak olan tüm örneklere şuradan ulaşabilirsiniz;

https://repl.it/@ObenSEVEN/sozlukler