177 lines
4.1 KiB
Markdown
177 lines
4.1 KiB
Markdown
---
|
|||
|
|
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
|
||
|
|
```
|