4. Liste ve sözlük
İki temel koleksiyon: sıralı liste ve anahtar→değer eşleyen sözlük.
Liste
notlar = [72, 95, 48, 88, 61]
notlar.ekle(100) # sona ekler
dogrula(notlar.uzunluk() == 6, "uzunluk")
dogrula(notlar[0] == 72, "indeksleme 0'dan başlar")
dogrula(notlar.icerir(48), "icerir")
dogrula(notlar.bul(48) == 2, "bul — konumu verir, yoksa -1")
notlar.sirala()
dogrula(notlar[0] == 48, "sıralı ilk eleman")
notlar.sil(0) # KONUMA göre siler
dogrula(notlar.uzunluk() == 5, "sil")
dogrula(notlar.dilim(0, 2).uzunluk() == 2, "dilim(baslangic, adet)")
yazdir(f"liste: {notlar}")| İşlem | Yazımı |
|---|---|
| eleman ekleme | l.ekle(deger) |
| eleman okuma | l[i] (0 tabanlı) |
| uzunluk | l.uzunluk() |
| arama | l.icerir(deger) · l.bul(deger) |
| sıralama | l.sirala() (Türkçe) · l.sirala_kod_noktasi() |
| silme | l.sil(konum) |
| parça | l.dilim(baslangic, adet) |
Boş liste ile başlayıp doldurabilirsiniz:
sepet = []
sepet.ekle("elma")
sepet.ekle("armut")
dogrula(sepet.uzunluk() == 2, "boş listeye ekleme")
yazdir(f"{sepet}")Toplam, en büyük, en küçük — döngüyle
⚠️ Listede toplam(), en_buyuk(), en_kucuk(), ters_cevir() diye
metot yoktur (ölçüldü: 'class QList<Sayı>' nesnesinde böyle bir metot
bulunamadı). Bunlar döngüyle yazılır — dilin bugünkü yüzeyi budur:
sayilar = [5, 3, 8, 1]
toplam = 0
enb = sayilar[0]
enk = sayilar[0]
dongu x icinde sayilar:
toplam = toplam + x
eger x > enb:
enb = x
eger x < enk:
enk = x
dogrula(toplam == 17, "toplam")
dogrula(enb == 8, "en büyük")
dogrula(enk == 1, "en küçük")
yazdir(f"toplam={toplam} en_buyuk={enb} en_kucuk={enk}")İki argümanlı bir en_buyuk(a, b) fonksiyonu da yoktur; karşılaştırmayı
eger ile yazın.
dogru/yanlis listesi de kurulabilir:
secimler = [dogru, yanlis, dogru]
secimler.ekle(yanlis)
say = 0
dongu s icinde secimler:
eger s:
say = say + 1
dogrula(say == 2, "mantık listesi")İç içe liste (tablo, matris)
Listenin öğeleri liste olabilir. İç listeler aynı tipte olmalı (hepsi tam sayı, hepsi ondalık ya da hepsi metin listesi):
m = [[1, 2], [3, 4]]
dogrula(m[1][0] == 3, "satır 1, sütun 0")
tablo = []
tablo.ekle([1, 2, 3])
tablo.ekle([4, 5, 6])
toplam = 0
dongu satir icinde tablo:
dongu h icinde satir:
toplam = toplam + h
dogrula(toplam == 21, "tüm hücreler")
yazdir(tablo)⚠️ Bir listenin bütün öğeleri aynı tipte olur: [1, "a"] derleme
hatasıdır (KARISIK_LISTE). Tek istisna sayılardır: [1, 2.5] ondalık
listedir ([1.0, 2.5]).
⚠️ [[1, 2], [3.5]] gibi karışık bir liste derleme hatası verir
(KARISIK_LISTE): tam sayı ve ondalık iç listeler ayrı tiplerdir. Tam
sayıları ondalık yazın: [[1.0, 2.0], [3.5]].
Liste üzerinde dönmek
urunler = ["klavye", "fare", "ekran"]
dongu u icinde urunler:
yazdir("• " + u)
# sıra numarası gerekiyorsa sayaç tutulur:
i = 0
iken i < urunler.uzunluk():
yazdir(f"{i + 1}. {urunler[i]}")
i = i + 1Sözlük
bilgi = {"isim": "Semih", "yas": 28, "aktif": dogru}
bilgi["sehir"] = "İstanbul" # ekleme
bilgi["yas"] = 29 # güncelleme
dogrula(bilgi["isim"] == "Semih", "okuma")
dogrula(bilgi.var_mi("sehir"), "var_mi")
dogrula(bilgi.icerir("yas"), "icerir — var_mi ile aynı iş")
dogrula(bilgi.uzunluk() == 4, "uzunluk")
bilgi.sil("aktif") # ANAHTARA göre siler
dogrula(bilgi.uzunluk() == 3, "sil")
yazdir(f"sözlük: {bilgi}")⚠️ liste.sil(i) konuma, sozluk.sil(anahtar) anahtara göre siler.
Listede olmayan bir konumu silmek (l.sil(10)) çalışma hatası verir —
sessizce hiçbir şey yapmadan geçmez.
Aynı adın iki koleksiyonda farklı anlamı vardır.
Sözlük bir yapının alanı olabilir; alan üzerinden yazılır ve okunur:
yapi Depo:
stok: sozluk<metin, sayi> = {}
d = Depo()
d.stok["elma"] = 3
d.stok["armut"] = 5
dogrula(d.stok["elma"] + d.stok["armut"] == 8, "sözlük alanı")İç içe sözlük ve listeye (örneğin çözülmüş JSON'a) zincirle erişilir; eksik
anahtar ya da sınır dışı konum .kbl satırıyla hata verir:
kullan json
v = json.coz("{\"kisi\": {\"ad\": \"Ada\", \"notlar\": [70, 90]}}")
dogrula(v["kisi"]["ad"] == "Ada", "iç içe anahtar")
dogrula(v["kisi"]["notlar"][1] == 90, "iç içe liste")Sözlükte gezmek
h = {"ad": "Deniz", "sehir": "İzmir"}
dongu k icinde h.anahtarlar():
yazdir(f"{k} = {h[k]}")
dogrula(h.anahtarlar().uzunluk() == 2, "anahtarlar()")
dogrula(h.degerler().uzunluk() == 2, "degerler()")Listede yapı tutmak
Listeler yapı (yapi) nesnelerini de tutar — ayrıntısı
5. sayfada:
yapi Urun:
ad = ""
fiyat = 0
sepet = []
k = Urun()
k.ad = "Klavye"
k.fiyat = 750
sepet.ekle(k)
f = Urun()
f.ad = "Fare"
f.fiyat = 300
sepet.ekle(f)
toplam = 0
dongu u icinde sepet:
yazdir(f" {u.ad} — {u.fiyat} TL")
toplam = toplam + u.fiyat
dogrula(toplam == 1050, "sepet toplamı")
yazdir(f"sepet toplamı: {toplam} TL")koleksiyon — toplama ve dönüştürme
Listenin kendi metotları (ekle · sil · sirala · icerir · uzunluk) yerinde
çalışır. Toplama ve dönüştürme işlemleri ayrı bir modüldedir ve hepsi kopya
döner — kaynak liste değişmez.
kullan kaba.koleksiyon
l = [3, 1, 2, 3]
dogrula(koleksiyon.topla(l) == 9, "topla")
dogrula(koleksiyon.en_kucuk(l) == 1, "en_kucuk")
dogrula(koleksiyon.en_buyuk(l) == 3, "en_buyuk")
dogrula(koleksiyon.say(l, 3) == 2, "say")
# Bulunamayan öğe: istisna DEĞİL, -1
dogrula(koleksiyon.indeks(l, 2) == 2, "indeks")
dogrula(koleksiyon.indeks(l, 9) == 0 - 1, "yoksa -1")
# Sıra
dogrula(koleksiyon.sirali(l).uzunluk() == 4, "sirali kopya döner")
dogrula(l.uzunluk() == 4, "kaynak değişmedi")
# Koşullu
buyukler = koleksiyon.filtrele(l, (x) => x > 1)
dogrula(buyukler.uzunluk() == 3, "filtrele")
dogrula(koleksiyon.esle(l, (x) => x * 10).uzunluk() == 4, "esle")
dogrula(koleksiyon.hepsi(l, (x) => x > 0), "hepsi")
dogrula(koleksiyon.herhangi(l, (x) => x > 2), "herhangi")
yazdir("koleksiyon tamam")⚠️ benzersiz SIRAYI KORUR. [3, 1, 2, 3] → [3, 1, 2]. Önce sıralayıp
komşuları atan bir uygulama [1, 2, 3] verirdi; paket adı ya da yol listesi
gibi sıraya bağlı verilerde bu sessiz bir bozulmadır.
⚠️ Boş listede hepsi DOĞRU, herhangi YANLIŞ döner (Python ile aynı).
"Hepsi sağlıyor mu?" sorusunun boş kümede cevabı evettir.
⚠️ esle girdiyle AYNI TÜR liste döner. Sayı listesinden metin listesi
üretmek bu imzayla ifade edilemez; onun için dongu yazılır. Sessizce yanlış
tür üretmektense açıkça desteklememek yeğdir.
⚠️ Boş liste sabiti [] METİN listesidir. Öğe tipi olmadığı için
koleksiyon.topla([]) sayı beklendiğinde derlenmez. Sayı listesi isteyen
[0] ile başlayıp sil(0) yapar ya da listeyi filtrele ile türetir.