Sözlükler ve Demetler (Python Dersi 8)

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")) # None
print(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: eklendi
ogrenci["yas"] = 22 # var olan anahtar: güncellendi
print(ogrenci)
# {'ad': 'Ayşe', 'yas': 22, 'bolum': 'Bilgisayar', 'sehir': 'Adana'}
del ogrenci["bolum"] # sil
print(ogrenci)
# {'ad': 'Ayşe', 'yas': 22, 'sehir': 'Adana'}

in sözlükte anahtarlara bakar, değerlere değil:

print("ad" in ogrenci) # True
print("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) + 1
print(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, boylam
print(konum[0]) # 36.99
konum[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 = konum
print(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] = puan
print()
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şe
Ayşe notu: 85
Öğrenci adı (bitirmek için 'bitti'): Mert
Mert notu: 45
Öğrenci adı (bitirmek için 'bitti'): Zeynep
Zeynep notu: 92
Öğrenci adı (bitirmek için 'bitti'): bitti
Ayş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ğer hem ekler hem günceller; del siler.
  • items() anahtar-değer çiftlerini, keys() ve values() ayrı ayrı verir.
  • Demet ( ) ile kurulur ve değiştirilemez; sabit kalması gereken veriler için kullanılır.

Alıştırmalar

  1. meyveler = {"elma": 30, "muz": 45} sözlüğüne "armut": 25 ekle, elmanın fiyatını 35 yap ve tüm fiyatların toplamını yazdır.
  2. Üç ülkeyi başkentiyle eşleştiren bir sözlük kur ve döngüyle “Türkiye → Ankara” biçiminde yazdır.
  3. renk = (255, 128, 0) demetini paket açmayla r, g, b değişkenlerine dağıt ve yazdır.
  4. "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

  1. meyveler["armut"] = 25, meyveler["elma"] = 35, print(sum(meyveler.values())) sonucu 105.
  2. baskentler = {"Türkiye": "Ankara", "Japonya": "Tokyo", "İspanya": "Madrid"}, sonra for ulke, sehir in baskentler.items(): print(f"{ulke} → {sehir}").
  3. r, g, b = renk, print(r, g, b) sonucu 255 128 0.
  4. 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.


Hatice Özbolat | Teknoloji ve AI Rehberi sitesinden daha fazla şey keşfedin

Son gönderilerin e-postanıza gönderilmesi için abone olun.

Comments

“Sözlükler ve Demetler (Python Dersi 8)” için bir yanıt

  1. […] Python Dersi 8’de, fonksiyonları ve varsayılan değerleri Python Dersi 9’da […]

Bir yanıt yazın