flowchart TD
A["students: list"] --> B["record 1: dict"]
A --> C["record 2: dict"]
A --> D["record 3: dict"]
B --> B1["number"]
B --> B2["name"]
B --> B3["grade"]
Kayıtlar ve iç içe veri yapıları
Programlama Temelleri dersinde liste içinde sözlük gibi iç içe yapılarla tanıştınız. Bu hafta aynı sözdizimini yeniden öğrenmeyeceğiz. Asıl sorumuz şudur:
Aynı kayıt kümesini farklı biçimlerde düzenlersek hangi işlemler kolaylaşır, hangileri zorlaşır?
Bu derste henüz sınıf tasarımı yapmıyoruz. Bu nedenle kayıtları çoğunlukla sözlüklerle temsil edeceğiz; ancak kayıtların hangi dış yapı içinde tutulduğu problem gereksinimine göre değişecektir.
1 Bu hafta neleri yapabilmelisiniz?
Bölümün sonunda:
- Bir kaydı sözlükle temsil edebilmeli,
- Çok sayıda kaydı liste içinde sözlüklerle düzenleyebilmeli,
- Aynı kayıtları kimliğe göre indeksleyen bir
dictgörünümü oluşturabilmeli, - Gruplama için
dict+listyapısını kullanabilmeli, - Kayıt ekleme, güncelleme, filtreleme ve özetleme işlemleri gerçekleştirebilmeli,
- Aynı verinin farklı temsil biçimlerinin hangi işlemleri kolaylaştırdığını açıklayabilmeli,
- Sığ kopya ve ortak referans davranışını iç içe yapılarda fark edebilmelisiniz.
2 Bir kayıt: alan adları neden önemlidir?
Bir öğrenciyi tek tek değişkenlerle tutabiliriz:
number = 102
name = "Bora"
department = "Yazılım"
grade = 78Fakat bu değerlerin aynı öğrenciye ait olduğu yapısal olarak görünmez. Sözlük bu ilişkiyi daha açık hâle getirir:
Burada sözlük, alan adlarını doğrudan görünür kılar.
3 Temsil 1 — liste içinde kayıtlar
Bir sınıftaki öğrencileri liste içinde sözlüklerle tutabiliriz:
Bu temsil özellikle şu işlemler için doğaldır:
- Kayıtların sırasını koruma,
- Bütün kayıtları dolaşma,
- Filtreleme,
- Sıralı rapor üretme.
4 Liste üzerinde kimliğe göre arama
Öğrenci numarasına göre kayıt bulmak için listeyi dolaşabiliriz:
Bu çözüm yanlış değildir. Fakat aynı tür arama binlerce kez yapılacaksa her seferinde listeyi dolaşmak daha az uygun olabilir.
5 Temsil 2 — kimliğe göre indekslenmiş sözlük
Aynı kayıtları numaradan kayda erişecek biçimde düzenleyebiliriz:
Bu temsil, “102 numaralı öğrenci kim?” sorusunu doğrudan ifade eder.
5.1 Aynı veri, farklı güçlü taraf
| Temsil | Güçlü olduğu işlem |
|---|---|
list[dict] |
sırayla dolaşma, filtreleme, raporlama |
dict[id -> record] |
kimliğe göre sık erişim |
Bir temsilin daha iyi olması problemden bağımsız değildir. En sık yapılan işlem, dış veri yapısının seçimini etkiler.
6 Temsil 3 — gruplama: dict + list
Bazen anahtardan tek bir kayda değil, bir kayıt grubuna ulaşmak isteriz. Örneğin öğrencileri bölüme göre gruplayalım:
Burada dış sözlüğün her anahtarı bir grubu, değer olarak tutulan liste ise o grubun üyelerini temsil eder.
7 Üç temsili birlikte görelim
flowchart LR
R["Aynı kayıt kümesi"] --> L["list[dict]"]
R --> I["dict[id → record]"]
R --> G["dict[group → list[record]]"]
L --> L1["sıra / filtre / rapor"]
I --> I1["kimliğe göre erişim"]
G --> G1["gruba göre erişim"]
Gerçek programlarda bu görünümlerden birden fazlası aynı anda bulunabilir.
8 Aynı kayıtların birden çok yapıdan görülmesi
Bir listedeki kayıtları indeksleyen sözlüğü sonradan oluşturabiliriz:
Neden listedeki kayıt da değişti? Çünkü students listesi ile by_number sözlüğü aynı öğrenci sözlüğü nesnesine referans veriyor.
Bu davranış yararlı olabilir: tek kaydı iki ayrı yerde kopyalamadan iki farklı erişim biçimi oluştururuz. Ancak bağımsız kopya bekliyorsak hata kaynağı olabilir.
9 Filtreleme kalıbı
Belirli koşula uyan kayıtları yeni bir listede toplayalım:
Filtrelemede bütün kayıtları görmek gerektiği için list[dict] temsili doğal bir seçimdir.
10 Alıştırma — düşük stoklu ürünler
stock değeri 10’dan küçük ürünlerin adlarını low_stock listesine ekleyin.
Beklenen sonuç:
['Defter', 'Silgi']
if product["stock"] < 10: koşulundan sonra low_stock.append(...) kullanın.
for product in products:
if product["stock"] < 10:
low_stock.append(product["name"])11 Alıştırma — kimliğe göre indeks oluştur
Aşağıdaki ürünleri code alanını anahtar olarak kullanarak by_code sözlüğünde indeksleyin.
Sözlüğün anahtarı product["code"], değeri ise product kaydının kendisi olabilir.
for product in products:
by_code[product["code"]] = product12 Özetleme
Kayıtlardaki sayısal alanları özetlemek için biriktirici kalıbını kullanabiliriz:
Bu bölümde önemli olan toplam hesabının kendisinden çok, kayıt yapısındaki belirli alanları sistematik biçimde işleyebilmenizdir.
13 İç içe yapıları okurken adım adım düşünün
Şu ifadeyi inceleyelim:
students[1]["courses"][0]Bunu tek seferde değil adım adım okuyun:
students[1]→ ikinci öğrenci kaydı,["courses"]→ o kaydın ders listesi,[0]→ ilk ders.
Bu alışkanlık, iç içe yapılardaki indeks/anahtar hatalarını azaltır.
14 Sığ kopya tekrar karşımıza çıkıyor
.copy() dış sözlüğü kopyalar; içteki tags listesi paylaşılmaya devam eder. Bu, 2. haftadaki sığ kopya fikrinin kayıtlar üzerindeki karşılığıdır.
15 Küçük karar çalışması
Aynı öğrenci verisi için aşağıdaki gereksinimlerde hangi temsili önceliklendirirsiniz?
- Bütün öğrencileri kayıt sırasıyla ekranda göstermek.
- Öğrenci numarasına göre saniyede çok sayıda sorgu yapmak.
- Bölüm adına göre o bölümdeki öğrencilerin tamamına ulaşmak.
Seçenekler:
A. list[dict]
B. dict[number -> record]
C. dict[department -> list[record]]
Yanıtınızda yalnızca yapının adını değil, hangi işlemi kolaylaştırdığı bilgisini de yazın.
16 Bölüm özeti
- Bir kayıt sözlükle temsil edilebilir.
- Çok sayıda kayıt için
list[dict]sıralı dolaşma, filtreleme ve raporlama açısından doğaldır. - Aynı kayıtları
dict[id -> record]biçiminde indekslemek kimliğe göre sık erişimi kolaylaştırır. dict[group -> list[record]]gruplama problemlerine uygundur.- Aynı kayıt nesneleri birden çok koleksiyon tarafından referans edilebilir.
- Temsil seçimi sözdizimine değil işlem gereksinimine dayanır.
- İç içe veri yapılarında sığ kopya davranışı önemini korur.
17 Kendinizi kontrol edin
list[dict]hangi işlemlerde doğaldır?- Öğrenci numarasına göre çok sık erişim gerekiyorsa dış temsil nasıl değiştirilebilir?
- Bölüme göre öğrenci gruplamak için hangi yapı kombinasyonu uygundur?
studentslistesi ileby_numbersözlüğü aynı kayıt nesnesini gösteriyorsa birindeki değişiklik neden diğerinde görünür?- Filtreleme için neden çoğu zaman bütün kayıtları dolaşmak gerekir?
- Sığ kopyalanmış bir sözlüğün içindeki liste neden hâlâ paylaşılabilir?