Python'da sözlük (dictionary), verileri anahtar-değer çiftleri halinde saklayan bir veri yapısıdır. Her değere, listelerdeki gibi sayısal bir sıra numarasıyla değil, kendine özgü bir anahtarla ulaşırsınız. Bu sayede "üçüncü eleman neydi" diye düşünmek yerine "kullanıcı adı neydi" gibi anlamlı sorularla veriye erişebilirsiniz. Sözlükler, verilerinizi isimlendirerek tutmak ve anahtarla hızlıca bulmak istediğinizde listelerden daha pratik bir çözüm sunar.
Python'da Sözlük Nedir?
Sözlük, süslü parantez {} içinde tanımlanan ve her elemanı bir anahtar (key) ile bir değerden (value) oluşan bir koleksiyon tipidir. Anahtarlar sözlük içinde benzersiz olmak zorundadır; aynı anahtarı iki kez kullanırsanız ikinci değer öncekinin üzerine yazılır. Değerler ise istediğiniz türde olabilir: sayı, metin, liste, hatta başka bir sözlük.
Sözlüklerin asıl gücü, bir değeri ararken listede baştan sona gezmek zorunda kalmamanızdır. Python, anahtarı doğrudan hedef değere yönlendirir, bu yüzden büyük veri kümelerinde arama işlemleri liste kullanımına göre çok daha hızlıdır. Bir kullanıcı profilini, bir ürünün fiyat bilgisini veya bir öğrencinin notlarını tutarken sözlük, verinin anlamını da yapının içine taşır.
ogrenci = {
"ad": "Ayşe",
"yas": 21,
"bolum": "Bilgisayar Mühendisliği"
}
Yukarıdaki örnekte "ad", "yas" ve "bolum" anahtarlardır; karşılarındaki değerler ise bu anahtarlara karşılık gelen bilgilerdir.
Liste mi Sözlük mü? Üç Maddelik Karar Tablosu

Liste ve sözlük arasında seçim yaparken kendinize şu üç soruyu sormanız yeterlidir:
- Sıra önemli mi? Verileri belirli bir dizilişte tutmanız gerekiyorsa (örneğin işlem adımları) liste daha uygundur. Sıralamanın önemli olmadığı, sadece "hangi bilgi hangi isme karşılık geliyor" sorusunun önemli olduğu durumlarda sözlük tercih edilir.
- Anahtarla erişim gerekiyor mu? Bir değere sayısal indeks yerine anlamlı bir isimle ulaşmak istiyorsanız (örneğin
"email"anahtarıyla e-posta adresine ulaşmak) sözlük kullanmalısınız. - Veriler birbirinden bağımsız mı yoksa ilişkili mi? Aynı türde tekrar eden öğeler (örneğin bir alışveriş listesi) için liste; birbirine bağlı ama farklı türde bilgiler (örneğin bir kişinin adı, yaşı, şehri) için sözlük daha mantıklıdır.
# Liste: sıralı ve aynı türde veriler
renkler = ["kırmızı", "mavi", "yeşil"]
# Sözlük: anahtarla erişilen, ilişkili veriler
urun = {"isim": "Klavye", "fiyat": 450}
Kısacası, verinizi "kaçıncı sırada" diye değil "hangi isimle" diye sorguluyorsanız sözlük doğru seçimdir.
Sözlük Oluşturma ve Köşeli Parantezle Erişim
Bir sözlük oluşturmak için süslü parantez içine anahtar-değer çiftlerini virgülle ayırarak yazmanız yeterlidir. Değere ulaşmak için ise anahtarı köşeli parantez içinde belirtirsiniz:
urun = {"isim": "Klavye", "fiyat": 450, "stok": 12}
print(urun["isim"]) # Klavye
print(urun["fiyat"]) # 450
Bu yöntem hızlı ve okunaklıdır ama bir riski vardır: sözlükte olmayan bir anahtarı köşeli parantezle çağırırsanız Python KeyError hatası fırlatır ve program çalışmayı durdurur.
print(urun["renk"])
# KeyError: 'renk'
Bu yüzden anahtarın kesin olarak var olduğundan eminseniz köşeli parantez kullanmak pratiktir; ancak anahtarın bulunmama ihtimali varsa bu yaklaşım programınızı kırabilir. Bir sonraki bölümde bu riski ortadan kaldıran get() yöntemini ele alacağız.
get() ile Güvenli Erişim, Ekleme ve Güncelleme
Bir sözlükte olmayan anahtara köşeli parantezle erişmeye çalışırsan KeyError alırsın. get() metodu bu riski ortadan kaldırır: anahtar varsa değerini, yoksa None (veya sen belirlediğin bir varsayılan değeri) döndürür.
urun_fiyatlari = {"elma": 12, "armut": 15}
print(urun_fiyatlari.get("elma")) # 12
print(urun_fiyatlari.get("muz")) # None
print(urun_fiyatlari.get("muz", 0)) # 0
İkinci parametre, anahtar bulunamadığında dönecek varsayılan değeri belirtir. Stok kontrolü, fiyat sorgulama gibi "anahtar olmayabilir" senaryolarında get() kullanmak, kodun her yerine if anahtar in sozluk kontrolü yazmaktan daha temiz bir yaklaşımdır.
Sözlüğe yeni bir anahtar eklemek ya da mevcut bir anahtarın değerini güncellemek için aynı sözdizimi kullanılır:
urun_fiyatlari["muz"] = 8 # yeni anahtar ekler
urun_fiyatlari["elma"] = 14 # mevcut anahtarı güncelle
Python burada anahtarın var olup olmadığına bakar: yoksa ekler, varsa üzerine yazar. Bu davranış hem avantaj hem de dikkat edilmesi gereken bir noktadır çünkü yanlışlıkla mevcut bir anahtarı sıfırlayabilirsin.
pop(), keys(), values(), items()

Bir anahtarı sözlükten çıkarıp değerini almak istediğinde pop() işine yarar. Anahtar yoksa KeyError fırlatır, bunu önlemek için ikinci parametre olarak varsayılan değer verilebilir:
stok = {"kalem": 50, "silgi": 20, "defter": 30}
silinen = stok.pop("silgi")
print(silinen) # 20
print(stok) # {'kalem': 50, 'defter': 30}
print(stok.pop("kitap", "yok")) # yok, hata vermez
keys(), values() ve items() metodları sözlüğün farklı görünümlerini (view) döndürür. Bu metotların döndürdüğü nesneler sırasıyla dict_keys, dict_values ve dict_items türlerindedir; liste değildir ve sözlük değiştiğinde bu değişiklikleri yansıtan dinamik görünüm nesneleridir.
print(stok.keys()) # dict_keys(['kalem', 'defter'])
print(stok.values()) # dict_values([50, 30])
print(stok.items()) # dict_items([('kalem', 50), ('defter', 30)])
En sık kullanım alanı döngülerdir:
for urun, adet in stok.items():
print(f"{urun}: {adet} adet")
items() sayesinde anahtar ve değere tek döngüde birlikte erişirsin, ayrıca stok.keys() üzerinde döngü kurmaya gerek kalmadan for urun in stok: yazmak da aynı sonucu verir çünkü sözlükler varsayılan olarak anahtarları üzerinde dolaşır.
İç İçe Sözlükler: Öğrenci-Not Senaryosu
Gerçek projelerde sözlüklerin içinde başka sözlükler veya listeler barındırmak yaygındır. Örneğin öğrenci adlarını, o öğrencinin aldığı notların listesiyle eşleyebiliriz:
notlar = {
"Ayşe": [85, 90, 78],
"Mehmet": [60, 70, 65],
"Zeynep": [95, 92, 88],
}
def ortalama_hesapla(ogrenci):
puanlar = notlar.get(ogrenci)
if not puanlar:
return f"{ogrenci} için kayıt bulunamadı."
ortalama = sum(puanlar) / len(puanlar)
return f"{ogrenci} ortalaması: {ortalama:.1f}"
print(ortalama_hesapla("Ayşe")) # Ayşe ortalaması: 84.3
print(ortalama_hesapla("Ali")) # Ali için kayıt bulunamadı.
Burada kritik nokta notlar.get(ogrenci) kullanımıdır. Köşeli parantezle notlar["Ali"] yazsaydık, olmayan bir öğrenci sorgulandığında program KeyError ile çökerdi. get() sayesinde None döner, if not puanlar kontrolü de bunu yakalayıp anlamlı bir mesaj üretir.
Tüm öğrencilerin ortalamasını tek seferde görmek istersen items() ile döngü kurman yeterli:
for ogrenci, puanlar in notlar.items():
print(f"{ogrenci}: {sum(puanlar) / len(puanlar):.1f}")
Bu yapı, gerçek dünyadaki JSON verileriyle çalışırken de karşına çıkacağın en temel desendir: dış sözlük kimlik bilgisini tutar, iç yapı (liste ya da başka bir sözlük) detayları taşır.
Sık Sorulan Sorular
Liste ile sözlük arasındaki temel fark nedir? Liste, sırayla dizilmiş elemanları indeks numarasıyla tutar (0, 1, 2...). Sözlük ise her değeri anlamlı bir anahtarla eşleştirir. Verilere "kaçıncı sırada" değil "hangi isimle" ulaşmak istiyorsan sözlük daha uygundur.
Sözlükte anahtar olarak her şey kullanılabilir mi? Hayır. Anahtarlar değiştirilemez (immutable) türden olmalı; yani string, sayı veya tuple kullanabilirsin. Liste ya da başka bir sözlüğü anahtar olarak kullanamazsın, çünkü bunlar değiştirilebilir yapılardır ve Python bunlara sabit bir "hash" değeri atayamaz.
Aynı anahtarı iki kez tanımlarsam ne olur? Hata almazsın, ama ikinci atadığın değer birincinin üzerine yazılır. Sözlükte her anahtar tekildir, aynı anahtarı tekrar kullanmak güncelleme anlamına gelir.
Sözlükteki eleman sırası korunur mu? Python 3.7 ve sonrasında evet, sözlükler eklenme sırasını korur. Ama sözlüğü sıralı bir yapı gibi kullanmak yerine, hâlâ anahtar üzerinden erişim yapman en doğru yaklaşımdır.
Var olmayan bir anahtara köşeli parantezle erişirsem ne olur? KeyError hatası alırsın. Bu yüzden anahtarın var olup olmadığından şüphen varsa get() metodunu kullanmak, hem daha güvenli hem daha okunaklı bir çözümdür.
Sözlükler, verini anahtar-değer mantığıyla düzenlemenin en pratik yollarından biri. Temel erişim ve güncelleme metotlarını öğrendikten sonra iç içe yapılarla da rahatça çalışabilirsin.