Files

177 lines
4.1 KiB
Markdown
Raw Permalink Normal View History

---
baslik: Sözlükler
bolum: Veri yapıları
ozet: Anahtar-değer çiftleri, ekleme, sorgulama, gezme ve sayım
---
Listede bir öğeye sıra numarasıyla ulaşırsın. Ama "Ankara'nın plakası kaç?" sorusunda sıra numarası işe yaramaz. Sözlük, her değeri bir **anahtarla** eşleştirir: `plaka["Ankara"]` gibi.
## Sözlük oluşturmak
Süslü parantez içine `anahtar: değer` çiftlerini virgülle ayırarak yazarsın.
```kbl
plaka = {"İstanbul": 34, "Ankara": 6, "İzmir": 35}
yazdir(plaka["Ankara"])
yazdir(plaka.uzunluk())
```
```cikti
6
3
```
## Ekleme ve güncelleme
Olmayan bir anahtara değer atamak yeni çift ekler; var olan bir anahtara atamak değeri değiştirir.
```kbl
stok = {"elma": 40, "armut": 25}
stok["kiraz"] = 12
stok["elma"] = stok["elma"] - 5
yazdir(stok["elma"])
yazdir(stok["kiraz"])
```
```cikti
35
12
```
## Anahtar var mı?
Sözlükte olmayan bir anahtarı okumak programı hatayla durdurur. Emin değilsen önce `var_mi()` ile sor.
```kbl
plaka = {"İstanbul": 34, "Ankara": 6}
dongu sehir icinde ["Ankara", "Konya"]:
eger plaka.var_mi(sehir):
yazdir(f"{sehir}: {plaka[sehir]}")
degilse:
yazdir(f"{sehir}: kayıtlı değil")
```
```cikti
Ankara: 6
Konya: kayıtlı değil
```
## Silmek
Sözlükte `sil()` **anahtara** göre siler (listede konuma göre silerdi).
```kbl
stok = {"elma": 40, "armut": 25, "kiraz": 12}
stok.sil("armut")
yazdir(stok.uzunluk())
yazdir(stok.var_mi("armut"))
```
```cikti
2
yanlış
```
## Sözlükte gezmek
`anahtarlar()` bütün anahtarları bir liste olarak verir. Her anahtar için değeri `sozluk[anahtar]` ile okursun.
```kbl
fiyat = {"ekmek": 12.5, "süt": 34.9, "peynir": 149.0}
anahtarlar = fiyat.anahtarlar()
anahtarlar.sirala()
dongu urun icinde anahtarlar:
yazdir(f"{urun:<8}{fiyat[urun]:>8.2f} TL")
```
```cikti
ekmek 12.50 TL
peynir 149.00 TL
süt 34.90 TL
```
> **Dikkat:** `anahtarlar()` listesi ekleme sırasında gelmez. Belli bir sırada gezmek istiyorsan yukarıdaki gibi önce `sirala()` ile sırala.
## Sayım: en sık kullanılan sözlük işi
Bir metinde hangi kelimenin kaç kez geçtiğini sayalım. Her kelime için: daha önce gördüysek sayısını artırırız, görmediysek 1 ile başlatırız.
```kbl
cumle = "bir elma bir armut iki elma bir kiraz"
sayim = {}
dongu kelime icinde cumle.bol(" "):
eger sayim.var_mi(kelime):
sayim[kelime] = sayim[kelime] + 1
degilse:
sayim[kelime] = 1
kelimeler = sayim.anahtarlar()
kelimeler.sirala()
dongu k icinde kelimeler:
yazdir(f"{k}: {sayim[k]}")
```
```cikti
armut: 1
bir: 3
elma: 2
iki: 1
kiraz: 1
```
## Değerleri toplamak
Bir sözlükteki sayıların toplamını anahtarlar üzerinden dönerek bulursun.
```kbl
notlar = {"Ayşe": 88, "Mehmet": 64, "Elif": 92}
toplam = 0
dongu ad icinde notlar.anahtarlar():
toplam += notlar[ad]
yazdir(f"Ortalama: {toplam / notlar.uzunluk():.1f}")
```
```cikti
Ortalama: 81.3
```
> **İpucu:** Bir sözlüğün bütün değerleri aynı türde olsun: hepsi sayı ya da hepsi metin. Öğrencinin adını, notunu ve şehrini birlikte tutmak istiyorsan *Yapılar* dersindeki `yapi` daha uygun bir araçtır.
## Alıştırma
```alistirma
`telefon` sözlüğüne `"Can": "0532 111 22 33"` kaydını ekle. Sonra `"Can"` ve `"Deniz"` için ya numarayı ya da `Deniz: bulunamadı` yazdır.
%%%
telefon = {"Ayşe": "0555 123 45 67"}
# buraya yaz
%%%
telefon = {"Ayşe": "0555 123 45 67"}
telefon["Can"] = "0532 111 22 33"
dongu ad icinde ["Can", "Deniz"]:
eger telefon.var_mi(ad):
yazdir(f"{ad}: {telefon[ad]}")
degilse:
yazdir(f"{ad}: bulunamadı")
%%%
Can: 0532 111 22 33
Deniz: bulunamadı
```
```alistirma
`metin_` içindeki her harfin kaç kez geçtiğini say (boşlukları atla). Harfleri sıralayıp `a 3` biçiminde, her biri ayrı satırda yazdır.
%%%
metin_ = "kar kara"
sayim = {}
# buraya yaz
%%%
metin_ = "kar kara"
sayim = {}
dongu h icinde metin_:
eger h == " ":
devam
eger sayim.var_mi(h):
sayim[h] = sayim[h] + 1
degilse:
sayim[h] = 1
harfler = sayim.anahtarlar()
harfler.sirala()
dongu h icinde harfler:
yazdir(f"{h} {sayim[h]}")
%%%
a 3
k 2
r 2
```