Algoritma: Sözlükler
Sözlük nedir, bir bilgiye konumuyla değil adıyla (anahtarıyla) nasıl ulaşırız? Anahtar–değer eşlemesini, ekleme, güncelleme, arama ve gezmeyi kalemle öğren.

Seri · Algoritmalar
Önceki yazıda bir işi bir kez tanımlayıp adıyla tekrar tekrar çağırmayı — fonksiyonları — öğrendik. Ondan önce de listelerle çok sayıda bilgiyi tek bir isim altında tutmayı gördük. Ama listelerin bir sınırı vardı: bir elemana ulaşmak için onun sıra numarasını (konumunu) bilmen gerekiyordu — notlar[3]. Peki ya “üçüncü öğrenci” değil de doğrudan “Ada’nın notu” lazımsa? İşte bu yazının konusu, bilgiye sırasıyla değil adıyla ulaşmanı sağlayan yeni bir veri yapısı: sözlük.
Adı tesadüf değil. Gerçek bir sözlüğü düşün: bir kelimeyi ararsın, karşısındaki tanımı bulursun. “Kelime 5.842” demezsin — kelimenin kendisini ararsın. Bilgisayardaki sözlük de tam olarak budur: bir anahtar (aradığın isim) verirsin, ona bağlı değeri (bilgiyi) alırsın.
Neden sözlüğe ihtiyacımız var?
Listeler yazısında bir soruna değinmiştik: bir öğrenci listesiyle bir not listesini yan yana tutmak. İsimler bir listede, notları başka bir listede; ikisini de aynı sırada tutuyorduk ki isimler[i] ile notlar[i] aynı öğrenciye denk gelsin. Buna paralel listeler demiştik:
isimler ← ["Ada", "Can", "Ece"]notlar ← [90, 75, 60]
# "Ada"nın notu: isimler'de kaçıncı sırada? Bul, sonra notlar'da aynı sıraya bak.Bu yaklaşım çalışır ama kırılgandır. isimler’e yeni bir isim ekleyip notlar’a not eklemeyi unutursan hizayı bozarsın; ondan sonra isimler[3] bir öğrenciyi, notlar[3] bambaşka birinin notunu gösterir. Üstelik “Ada’nın notu” için önce Ada’yı listede arayıp sırasını bulman (listelerdeki tek tek arama), sonra o sırayı öbür listede kullanman gerekir. İki liste, tek bir bilgi için iki iş.
Oysa aklında aslında tek bir eşleşme var: her isme bir not bağlı. “Ada → 90, Can → 75, Ece → 60.” İşte sözlük bu eşleşmeyi doğrudan, tek bir yapıda tutar:
notlar ← { "Ada": 90, "Can": 75, "Ece": 60 }
# "Ada"nın notu:YAZ notlar["Ada"] → 90İki liste, hizalama derdi, arama — hepsi tek satıra indi. notlar["Ada"] dediğinde bilgisayar sana Ada’nın notunu doğrudan verir; listeyi baştan sona taramaz, “Ada kaçıncı sıradaydı?” diye uğraşmaz.
Sözlük nedir?
Bir sözlük, birbirine bağlı anahtar–değer çiftlerinden oluşan bir veri yapısıdır.
- Anahtar (key): Aradığın şeyin adı — sözlükteki kelime, rehberdeki isim. Yukarıda
"Ada". - Değer (value): O anahtara bağlı bilgi — kelimenin tanımı, ismin numarası. Yukarıda
90.
Sözlüğü süslü parantezlerle { } yazar, her çifti anahtar: değer biçiminde belirtir, çiftleri virgülle ayırırız. Listede köşeli parantez [ ] ve sıra kullanıyorduk; sözlükte süslü parantez { } ve anahtar kullanırız:
rehber ← { "Ada": "0532...", "Can": "0543...", "Acil": "112" }
YAZ rehber["Acil"] → 112Dikkat et: anahtarlar illa metin olmak zorunda değil (sayı da olabilir), ama en çok işe yarar olduğu yer, anlamlı bir adla bilgiye ulaşmaktır. rehber["Acil"] yazmak, rehber[3] yazıp “acil numarası üçüncü sıradaydı galiba” diye hatırlamaya çalışmaktan çok daha nettir.
Bir değere ulaşmak
Sözlükten bir değeri almak için, tıpkı listedeki gibi köşeli parantez kullanırız — ama içine sıra numarası değil, anahtar yazarız:
notlar ← { "Ada": 90, "Can": 75, "Ece": 60 }
YAZ notlar["Ada"] → 90YAZ notlar["Ece"] → 60Bunu bir eşleme (bir yandan öbür yana götüren bir ok) gibi canlandırabilirsin: anahtarı verirsin, sözlük sana karşılığındaki değeri geri verir.
flowchart LR
A["Anahtar<br/>"Ada""] --> B["notlar<br/>SÖZLÜK<br/>Ada→90, Can→75, Ece→60"]
B --> C["Değer<br/>90"]Bu, fonksiyonlar yazısındaki kara kutuya benziyor: bir şey verip karşılığında bir şey alıyorsun. Fark şu ki burada verdiğin bir anahtar, aldığın da o anahtara bağlı değer.
Eklemek ve güncellemek
Sözlüğe yeni bir çift eklemek şaşırtıcı derecede basittir: yeni anahtara bir değer atarsın — tıpkı değişkenlere değer atarken kullandığımız ← oku gibi:
notlar ← { "Ada": 90, "Can": 75 }
notlar["Ece"] ← 60 (yeni bir çift: "Ece" → 60)# Artık: { "Ada": 90, "Can": 75, "Ece": 60 }Peki ya var olan bir anahtara yeniden değer atarsak? O zaman eski değer güncellenir:
notlar["Ada"] ← 95 ("Ada" zaten vardı → değeri 90'dan 95'e döner)# Artık: { "Ada": 95, "Can": 75, "Ece": 60 }Bir anahtar var mı? (kontrol)
Yukarıda değindiğimiz tuzağı hatırla: olmayan bir anahtarı istemek hataya yol açabilir. Bu yüzden sık sık “bu anahtar sözlükte var mı?” diye sormamız gerekir. Bunu koşullarla yaparız:
EĞER "Ada" anahtarı notlar içinde İSE YAZ "Ada'nın notu: " + notlar["Ada"]DEĞİLSE YAZ "Ada kayıtlı değil."BİTİREĞER"Ada" anahtarı notlar içinde İSE ifadesi geriye koşullardaki gibi bir doğru/yanlış (boolean) verir: anahtar sözlükteyse doğru, değilse yanlış. “Önce bak, güvendeysen kullan” düzeni — sözlüklerle çalışırken en sık kuracağın kalıplardan biri.
Sözlükte gezmek: her anahtar için
Listeyi baştan sona gezmek için döngü kullanıyorduk: bir sayaç i’yi 1’den uzunluk(liste)’ye kadar artırıp liste[i] diyorduk. Ama sözlükte sıra numarası yok — “3. anahtar” diye bir şey yok. O hâlde nasıl gezeceğiz?
Bunun için biraz farklı bir döngü kullanırız: “her anahtar için” (İngilizcede for-each) döngüsü. Bu döngü, sözlükteki anahtarları tek tek alıp sana verir; sen de her turda o anahtarı ve onun değerini işlersin:
notlar ← { "Ada": 90, "Can": 75, "Ece": 60 }
notlar İÇİNDEKİ HER anahtar İÇİN YAZ anahtar + ": " + notlar[anahtar]DÖNGÜ SONUBu döngü şunu yazdırır:
Ada: 90Can: 75Ece: 60Her turda anahtar sırayla “Ada”, “Can”, “Ece” olur; notlar[anahtar] ise o anahtarın değeridir. Döngüler yazısındaki ZAMAN … DÖNGÜ SONU sayaçlı döngüsünün, sözlüğe uyarlanmış bir kardeşi gibi düşünebilirsin: orada sayacı biz ilerletiyorduk, burada döngü bizim için sırayla her anahtarı getiriyor.
Silmek
Bir çifti sözlükten çıkarmak için, listelerdeki ÇIKAR’a benzer bir işlem kullanırız — ama sıra numarasıyla değil, anahtarla:
notlar ← { "Ada": 90, "Can": 75, "Ece": 60 }
"Can" anahtarını notlar'DAN ÇIKAR# Artık: { "Ada": 90, "Ece": 60 }Burada listedeki gibi “silince arkadaki elemanlar kayar” derdi yok — çünkü sözlükte sıra diye bir şey yoktu ki kaysın. “Can” çıkar, “Ada” ile “Ece” olduğu gibi kalır. Sözlüğün konumdan bağımsız oluşunun küçük ama hoş bir yan faydası.
Değer her şey olabilir: sözlük içinde liste
Şimdiye kadar değerlerimiz hep tek bir sayı ya da metindi. Ama bir anahtarın değeri bir liste de olabilir. Örneğin her öğrencinin birden çok notunu tutmak istersen:
notlar ← { "Ada": [90, 85, 100], "Can": [70, 60, 80] }
YAZ notlar["Ada"] → [90, 85, 100] (Ada'nın bütün notları)YAZ notlar["Ada"][1] → 90 (Ada'nın ilk notu)notlar["Ada"] sana bir liste verir; onun da ilk elemanını almak için yanına bir köşeli parantez daha eklersin: notlar["Ada"][1]. Böylece fonksiyonlardaki ortalama fonksiyonunu bir öğrencinin notlarına doğrudan uygulayabilirsin: ortalama(notlar["Ada"]). Küçük parçalar (sözlük, liste, fonksiyon) birbirine geçip daha büyük işler kuruyor — tıpkı fonksiyonlar yazısında söz verdiğimiz gibi.
Sözlük = bir şeyin özellikleri (nesneye doğru)
Sözlüğün bir kullanımı da, farklı şeyleri birbirine eşlemek değil, tek bir şeyin özelliklerini bir arada tutmaktır. Bir kişiyi düşün: adı, yaşı, şehri var. Bunları paralel değişkenlerde dağınık tutmak yerine, tek bir sözlükte toplayabilirsin:
kişi ← { "ad": "Ada", "yaş": 30, "şehir": "İstanbul" }
YAZ kişi["ad"] → AdaYAZ kişi["şehir"] → İstanbulBurada anahtarlar ("ad", "yaş", "şehir") o şeyin özellik adları, değerler ise o özelliklerin bilgisidir. kişi, artık bir bütün olarak “taşınabilir” bir bilgi paketi: bir fonksiyona tek başına verebilir, bir listenin elemanı yapabilirsin (örneğin kişiler ← [kişi1, kişi2, kişi3] — her elemanı bir sözlük olan bir liste).
Ne zaman liste, ne zaman sözlük?
İkisi de birden çok bilgiyi bir arada tutar; ama farklı sorulara iyi cevap verirler. Seçimi kolaylaştıran bir tablo:
| Soru / durum | Liste | Sözlük |
|---|---|---|
| Erişim neye göre? | Konuma göre (liste[3]) | Anahtara göre (notlar["Ada"]) |
| Sıra önemli mi? | Evet — eleman sırası anlamlıdır | Hayır — anahtarla ulaşılır |
| İyi olduğu soru | ”Sıradaki eleman ne?”, “Hepsini gez" | "Şu ismin/kimliğin karşılığı ne?” |
| Örnek | Bir alışveriş listesi, sıradaki adımlar | İsim→numara, ürün→fiyat, kelime→tanım |
| Aynı öğe iki kez? | Olabilir (aynı değer tekrarlanabilir) | Anahtar tekrarlanamaz (her anahtar tek) |
Kısa kural: veriyi baştan sona, sırayla işleyeceksen ya da sıranın kendisi anlamlıysa liste; bir isimden/kimlikten bir bilgiye hızlı ulaşman gerekiyorsa sözlük. Ve gördüğün gibi ikisi düşman değil, dost: sözlüğün değeri bir liste, listenin bir elemanı bir sözlük olabilir. Gerçek programlar bu ikisini iç içe kullanır.
Sık yapılan hatalar
Kendin dene
Kalem ve kâğıt yeter. Her egzersizde sözlüğü küçük bir tablo gibi çiz (bir sütun anahtarlar, bir sütun değerler), sonra adımları üstünde tek tek izle. Anahtarla değere ulaştığını, sıra numarasıyla değil, kendine hatırlat.
Egzersiz 1 — Telefon rehberi (kolay)
rehber ← { "Ada": "0532", "Can": "0543", "Acil": "112" }sözlüğünü çiz. Sonra sırayla şunları bul:rehber["Acil"],rehber["Ada"]. Ardındanrehber["Ece"] ← "0555"ekle ve sözlüğün son hâlini yaz.
Egzersiz 2 — Var mı, yok mu? (kolay)
Yukarıdaki
rehberiçin bir “numara bul” mantığı yaz: bir isim verildiğinde, o isim rehberde varsa numarasını, yoksa “Kayıtlı değil” yaz. Bunu"Can"ve"Zeynep"için çalıştır.
Egzersiz 3 — Sepet toplamı (orta)
fiyatlar ← { "elma": 15, "süt": 40, "ekmek": 10 }bir ürün→fiyat sözlüğü. Bir desepet ← ["elma", "elma", "ekmek"]listesi var. Sepetteki ürünlerin toplam fiyatını hesapla.
Egzersiz 4 — Harf sayacı (orta)
Bir
"kelebek"kelimesindeki her harfin kaç kez geçtiğini bir sözlükte topla. Sonuç şöyle bir sözlük olmalı:{ "k": 2, "e": 2, "l": 1, "b": 1 }.
Egzersiz 5 — Öğrenci karnesi (mini proje)
Her öğrenciyi notlarına eşleyen bir sözlük kur:
karne ← { "Ada": [90, 85, 100], "Can": [70, 60, 80] }. Sonra her öğrenci için adını ve not ortalamasını yazdır.
Özet
İlgili yazılar
Sıkça sorulan sorular
Sözlük (dictionary) nedir?
Sözlük, bir bilgiyi bir başka bilgiyle eşleştiren bir veri yapısıdır: her kaydın bir anahtarı (aradığın isim) ve bir değeri (o isme bağlı bilgi) vardır. Tıpkı gerçek bir sözlük gibi — bir kelimeyi (anahtar) arar, karşısındaki tanımı (değer) bulursun. Bir telefon rehberi de sözlüktür: isim → numara. Bir bilgiye sıra numarasıyla değil, adıyla ulaşmanı sağlar.
Liste ile sözlük arasındaki fark nedir?
Listede elemanlara konumla (sırayla) ulaşırsın: liste[1], liste[2]… Sözlükte ise elemanlara anlamlı bir anahtarla ulaşırsın: notlar["Ada"]. Liste "üçüncü eleman ne?" sorusuna, sözlük "Ada'nın notu ne?" sorusuna iyi cevap verir. Sıranın önemli olduğu, baştan sona gezeceğin veriler için liste; bir isimden bir bilgiye hızlı ulaşman gereken durumlar için sözlük kullanırsın.
Anahtar (key) ve değer (value) nedir?
Anahtar, aradığın şeyin adıdır — sözlükteki kelime, rehberdeki isim gibi. Değer, o anahtara bağlı bilgidir — kelimenin tanımı, ismin numarası gibi. Sözlük, anahtar–değer çiftlerinden oluşur. Anahtarı verirsin (notlar["Ada"]), karşılığındaki değeri alırsın (90). Bir sözlükte her anahtar tektir: aynı anahtar iki kez bulunamaz.
Sözlüğe nasıl eleman eklenir veya güncellenir?
İkisi de aynı basit adımla olur: anahtara bir değer atarsın. notlar["Zeynep"] ← 85 dersen, "Zeynep" anahtarı sözlükte yoksa yeni bir kayıt eklenir; zaten varsa değeri 85 ile değiştirilir (güncellenir). Yani sözlükte ekleme ile güncelleme aynı işlemdir; farkı, anahtarın o an sözlükte olup olmamasıdır.
Bir anahtarın sözlükte olup olmadığını nasıl kontrol ederiz?
Bir değere ulaşmadan önce anahtarının sözlükte olup olmadığını sormak önemlidir, çünkü olmayan bir anahtarı istemek hataya yol açabilir. Bunu bir koşulla yaparız: EĞER "Ada" anahtarı notlar içinde İSE … Böylece "önce var mı diye bak, varsa kullan" düzenini kurarsın. Bu kontrol, kelime sayacı gibi birçok algoritmanın kalbindedir.
Sözlükte nasıl gezinir (döngü) kurulur?
Listeyi sıra numarasıyla gezerdik; sözlükte sıra numarası yoktur, bu yüzden her anahtar için dönen bir "her-biri-için" (for-each) döngüsü kullanırız: notlar içindeki her anahtar için, o anahtarı ve notlar[anahtar] değerini işleriz. Böylece sözlükteki bütün çiftleri tek tek ziyaret edebilirsin — toplam almak, yazdırmak, saymak için.
Sözlük ile nesne (object) aynı şey midir?
Yakın akrabadırlar. Bir sözlükle tek bir şeyin özelliklerini tutabilirsin: kişi ← { "ad": "Ada", "yaş": 30, "şehir": "İstanbul" }. Burada anahtarlar özellik adları, değerler o özelliğin bilgisidir. Gerçek programlamada "nesne" dediğimiz şeyin temelinde çoğu zaman böyle bir anahtar–değer eşlemesi yatar. Yani sözlüğü anlamak, ileride nesneleri anlamanın da ilk adımıdır.
Sözlük ne zaman listeden daha iyidir?
Bir isimden (veya kimlikten) bir bilgiye sık sık ulaşman gerektiğinde. Paralel iki liste (isimler ve notlar) tutup hizalarını korumaya çalışmak yerine, tek bir sözlük (isim → not) tutarsın; hem hata riski azalır hem de "Ada'nın notu" gibi bir bilgiye doğrudan ulaşırsın. Ayrıca sözlük, aradığın anahtara listeyi baştan sona taramadan, neredeyse anında ulaşır.