Geçen derste notları bir listede topladık: [85, 70, 92]. Peki 92 kimin notu? Listede notlar duruyor ama sahipleri yok. İsimleri ayrı bir listede tutup sıraların karışmamasını umabilirsin, ama daha iyi bir yolu var: her değeri bir isimle eşleştiren sözlük. Bu derste sözlüklerin yanında, değiştirilemeyen küçük kutular olan demetleri de öğreniyoruz.
Bu dersin kodları ve alıştırmaları hazır bir not defterinde: Colab’da Aç.
Sözlük ne demek?
Adı üstünde: gerçek bir sözlükte bir kelimeyi bulursun, karşısında anlamı yazar. Python sözlüğü de böyle çalışır: bir anahtar (key) ve ona bağlı bir değer (value).
ogrenci = {"ad": "Ayşe", "yas": 21, "bolum": "Bilgisayar"}
Sözlük süslü parantezle { } kurulur. Her eleman anahtar: değer çiftidir ve çiftler virgülle ayrılır. Listede elemana sıra numarasıyla ulaşıyorduk; sözlükte anahtarın kendisiyle ulaşıyoruz.
Değere ulaşmak
print(ogrenci["ad"]) # Ayşe
Olmayan bir anahtarı istersen hata alırsın:
print(ogrenci["sehir"]) # KeyError: 'sehir'
Anahtarın olup olmadığından emin değilsen get kullan. Anahtar yoksa hata yerine None ya da senin verdiğin varsayılan değeri döndürür:
print(ogrenci.get("sehir")) # Noneprint(ogrenci.get("sehir", "bilinmiyor")) # bilinmiyor
Eklemek, değiştirmek, silmek
Sözlükte ekleme ile değiştirme aynı yazılır. Anahtar yoksa eklenir, varsa değeri güncellenir:
ogrenci["sehir"] = "Adana" # yeni anahtar: eklendiogrenci["yas"] = 22 # var olan anahtar: güncellendiprint(ogrenci)# {'ad': 'Ayşe', 'yas': 22, 'bolum': 'Bilgisayar', 'sehir': 'Adana'}del ogrenci["bolum"] # silprint(ogrenci)# {'ad': 'Ayşe', 'yas': 22, 'sehir': 'Adana'}
in sözlükte anahtarlara bakar, değerlere değil:
print("ad" in ogrenci) # Trueprint("Ayşe" in ogrenci) # False, çünkü "Ayşe" bir anahtar değil
Sözlüğü döngüyle gezmek
notlar = {"Ayşe": 85, "Mert": 45, "Zeynep": 92}for isim in notlar: print(isim)# Ayşe# Mert# Zeynep
Sözlüğü doğrudan gezersen sadece anahtarları alırsın. Anahtar ve değeri birlikte istiyorsan items() kullan:
for isim, puan in notlar.items(): print(f"{isim}: {puan}")# Ayşe: 85# Mert: 45# Zeynep: 92
for isim, puan in ... yazımı, zip ve enumerate kod kartlarındaki gibi her çifti iki değişkene dağıtır. Sadece anahtarlar ya da sadece değerler lazımsa keys() ve values() var:
print(list(notlar.keys())) # ['Ayşe', 'Mert', 'Zeynep']print(list(notlar.values())) # [85, 45, 92]print(sum(notlar.values())) # 222
Klasik bir sözlük işi: kelime saymak
Bir metinde her kelimenin kaç kez geçtiğini bulmak, sözlüklerin en bilinen kullanımlarından biri:
metin = "bir elma bir armut bir muz"sayac = {}for kelime in metin.split(): sayac[kelime] = sayac.get(kelime, 0) + 1print(sayac)# {'bir': 3, 'elma': 1, 'armut': 1, 'muz': 1}
metin.split() metni boşluklardan bölüp kelime listesi yapar. Asıl sihir sayac.get(kelime, 0) + 1 satırında: Kelime sözlükte yoksa 0’dan başlar, varsa mevcut sayıya 1 eklenir. Geçen dersteki “kumbara” mantığının sözlüktekini düşün: her kelimenin kendi kumbarası var.
Demetler: değişmeyen listeler
Demet (tuple), listeye benzer ama bir kez kurulduktan sonra değiştirilemez. Köşeli parantez yerine normal parantezle yazılır:
konum = (36.99, 35.33) # enlem, boylamprint(konum[0]) # 36.99konum[0] = 1 # TypeError: 'tuple' object does not support item assignment
Neden değişmeyen bir şey isteyelim? Çünkü bazı veriler zaten değişmemeli: bir şehrin koordinatları, bir rengin RGB değerleri, bir tarihin yıl-ay-günü. Demet kullanmak hem okuyana “bu sabit” mesajı verir hem de kazara değişmesini engeller.
Demetleri aslında daha önce de kullandın. Takas kod kartındaki a, b = b, a yazımı ve enumerate’in verdiği (0, "Kalem") çiftleri birer demet. Paket açma burada da çalışır:
enlem, boylam = konumprint(enlem, boylam) # 36.99 35.33
Bir demet sözlükte anahtar da olabilir; liste olamaz. İki şehir arası mesafeyi tutmak için:
mesafeler = {("Adana", "Mersin"): 70}print(mesafeler[("Adana", "Mersin")]) # 70
Mini program: sınıf defteri
Geçen dersin not programını büyütelim. Bu sefer her notu sahibinin adıyla saklayacağız:
sinif = {}while True: isim = input("Öğrenci adı (bitirmek için 'bitti'): ") if isim == "bitti": break puan = float(input(f"{isim} notu: ")) sinif[isim] = puanprint()for isim, puan in sinif.items(): if puan >= 50: print(f"{isim}: {puan} (Geçti)") else: print(f"{isim}: {puan} (Kaldı)")en_iyi = max(sinif, key=sinif.get)print(f"Sınıf birincisi: {en_iyi} ({sinif[en_iyi]})")print(f"Sınıf ortalaması: {sum(sinif.values()) / len(sinif):.1f}")
Örnek çalışma:
Öğrenci adı (bitirmek için 'bitti'): AyşeAyşe notu: 85Öğrenci adı (bitirmek için 'bitti'): MertMert notu: 45Öğrenci adı (bitirmek için 'bitti'): ZeynepZeynep notu: 92Öğrenci adı (bitirmek için 'bitti'): bittiAyşe: 85.0 (Geçti)Mert: 45.0 (Kaldı)Zeynep: 92.0 (Geçti)Sınıf birincisi: Zeynep (92.0)Sınıf ortalaması: 74.0
Yeni olan tek satır max(sinif, key=sinif.get). max(sinif) tek başına anahtarları alfabetik olarak karşılaştırırdı ve “Zeynep”i alfabede en sonda olduğu için seçerdi. key=sinif.get ise “karşılaştırırken her ismin notuna bak” demek. Sonuç yine Zeynep ama doğru sebepten.
Sık karşılaşılan hatalar
Olmayan anahtarı köşeli parantezle istemek. ogrenci["sehir"] anahtar yoksa KeyError verir. Emin değilsen ogrenci.get("sehir") kullan.
in‘in değerlere baktığını sanmak. "Ayşe" in ogrenci False döner, çünkü “Ayşe” bir değer. Değerlerde aramak için "Ayşe" in ogrenci.values() yaz.
Tek elemanlı demeti virgülsüz yazmak. (5) bir demet değil, sadece parantez içinde 5 sayısı. Tek elemanlı demet için virgül gerekir: (5,).
Aynı anahtarı iki kez yazmak. {"a": 1, "a": 2} hata vermez ama sonuncusu kazanır ve sözlükte tek "a": 2 kalır. Bir sözlükte her anahtar benzersizdir.
Bu derste öğrendiklerin
- Sözlük
{anahtar: değer}çiftlerinden oluşur; değere anahtarla ulaşılır. get(anahtar, varsayılan)anahtar yoksa hata yerine varsayılanı verir.sözlük[anahtar] = değerhem ekler hem günceller;delsiler.items()anahtar-değer çiftlerini,keys()vevalues()ayrı ayrı verir.- Demet
( )ile kurulur ve değiştirilemez; sabit kalması gereken veriler için kullanılır.
Alıştırmalar
meyveler = {"elma": 30, "muz": 45}sözlüğüne"armut": 25ekle, elmanın fiyatını 35 yap ve tüm fiyatların toplamını yazdır.- Üç ülkeyi başkentiyle eşleştiren bir sözlük kur ve döngüyle “Türkiye → Ankara” biçiminde yazdır.
renk = (255, 128, 0)demetini paket açmaylar,g,bdeğişkenlerine dağıt ve yazdır."python python veri bilim veri python"cümlesinde her kelimenin kaç kez geçtiğini bul, sonra en sık geçen kelimeyi yazdır.
Cevaplar
meyveler["armut"] = 25,meyveler["elma"] = 35,print(sum(meyveler.values()))sonucu105.baskentler = {"Türkiye": "Ankara", "Japonya": "Tokyo", "İspanya": "Madrid"}, sonrafor ulke, sehir in baskentler.items(): print(f"{ulke} → {sehir}").r, g, b = renk,print(r, g, b)sonucu255 128 0.- Kelime sayacı kalıbıyla
{'python': 3, 'veri': 2, 'bilim': 1}elde edilir;max(sayac, key=sayac.get)sonucu'python'.
Sıradaki ders
Şimdiye kadar yazdığımız kodları hep baştan sona tek parça yazdık. Not ortalamasını üç farklı yerde hesaplaman gerekse aynı satırları üç kez mi yazacaksın? Bir sonraki derste fonksiyonları öğreneceğiz: kodu bir kez yazıp istediğin kadar kullanmak.

Bir yanıt yazın