Sözlükler, kümeler ve koleksiyon seçimi

Listelerde bir değere erişmek için çoğunlukla indeks kullanırız. Fakat gerçek veriler çoğu zaman “0. eleman” veya “2. eleman” diye değil, ad, fiyat, stok, öğrenci numarası gibi anlamlı alanlarla düşünülür.

Bu hafta Python’ın sözlük (dict) yapısını anahtar–değer ilişkileri için, küme (set) yapısını ise tekrarsız değerleri tutmak için kullanacağız. Ayrıca “bu problem için liste mi, sözlük mü, küme mi?” sorusunu bilinçli biçimde sormaya başlayacağız.

Bu hafta neleri yapabilmelisiniz?

Bölümün sonunda:

  • sözlük oluşturabilmeli,
  • anahtar kullanarak değere erişebilmeli,
  • yeni anahtar–değer çifti ekleyebilmeli veya mevcut değeri güncelleyebilmeli,
  • get() ile eksik anahtarı daha güvenli biçimde sorgulayabilmeli,
  • sözlük üzerinde anahtarlar ve items() ile gezinebilmeli,
  • basit bir sayma/frekans tablosu oluşturabilmeli,
  • küme oluşturabilmeli ve tekrarlı değerlerin nasıl elendiğini açıklayabilmeli,
  • in ile kümede üyelik kontrolü yapabilmeli,
  • add() ile kümeye eleman ekleyebilmeli,
  • liste, sözlük ve küme arasında probleme uygun olanı seçebilmelisiniz.

Sözlük: anahtardan değere erişim

Bir ürün bilgisini listeyle şöyle tutmak mümkün olabilir:

urun = ["Kalem", 12.5, 40]

Fakat urun[1] ifadesinin ne olduğunu anlamak için listenin düzenini bilmek gerekir.

Sözlükte alanlara ad veririz:

urun = {
    "ad": "Kalem",
    "fiyat": 12.5,
    "stok": 40
}

Değerlere anahtar ile erişiriz:

print(urun["ad"])
print(urun["fiyat"])
print(urun["stok"])

Burada "ad", "fiyat" ve "stok" anahtarlardır.

Anahtar–değer ilişkisi

Sözlükte her anahtar bir değeri gösterir:

"ad"    → "Kalem"
"fiyat" → 12.5
"stok"  → 40

Anahtarlar benzersiz olmalıdır. Aynı anahtar yeniden atanırsa eski değer güncellenir.

urun = {"stok": 40}
urun["stok"] = 35

print(urun)

Sonuç:

{'stok': 35}

Yeni alan da eklenebilir:

urun["kategori"] = "Kırtasiye"

Tahmin et — sözlük nasıl değişir?

Aşağıdaki kodu çalıştırmadan önce çıktıyı tahmin edin:

Sözlükte alanların adla erişilebilir olması, kodun niyetini listede sabit indeks kullanmaktan daha görünür kılar.

Alıştırma — stok değerini güncelleyin

Bir satış sonrasında stoktan 3 ürün eksilsin.

Beklenen sonuç 9dur.

urun["stok"] = urun["stok"] - 3 yazabilirsiniz.

urun = {
    "ad": "Defter",
    "fiyat": 45,
    "stok": 12
}

urun["stok"] = urun["stok"] - 3

print(urun["stok"])

Eksik anahtar ve get()

Sözlükte olmayan bir anahtara köşeli parantezle erişmek KeyError üretir:

urun = {"ad": "Kalem"}
# print(urun["stok"])

Eğer alanın bulunmaması normal bir durumsa get() kullanılabilir:

urun = {"ad": "Kalem"}

stok = urun.get("stok")
print(stok)

Sonuç None olur.

Varsayılan değer de verebiliriz:

stok = urun.get("stok", 0)
print(stok)

Bu kez sonuç 0 olur.

Warning

get("stok", 0) kullanmak her problemde doğru değildir. Eksik stok bilgisinin gerçekten 0 anlamına gelip gelmediğini problem kuralı belirler.

Sözlük üzerinde gezinmek

Yalnızca anahtarlar üzerinde:

urun = {"ad": "Kalem", "fiyat": 12.5, "stok": 40}

for anahtar in urun:
    print(anahtar)

Anahtar ve değeri birlikte almak için items():

for anahtar, deger in urun.items():
    print(anahtar, deger)

items() her adımda (anahtar, deger) biçiminde iki değer verir; demet açma bilgimizi burada yeniden kullanıyoruz.

Sayma tablosu oluşturmak

Sözlüklerin güçlü kullanım alanlarından biri frekans sayımıdır.

Bir listedeki şehirlerin kaç kez geçtiğini bulalım:

sehirler = ["Samsun", "Ordu", "Samsun", "Amasya", "Ordu", "Samsun"]
sayilar = {}

for sehir in sehirler:
    sayilar[sehir] = sayilar.get(sehir, 0) + 1

print(sayilar)

Sonuç:

{'Samsun': 3, 'Ordu': 2, 'Amasya': 1}

Her şehir ilk kez görüldüğünde get(sehir, 0) değeri 0 verir; sonraki karşılaşmalarda mevcut sayı alınır ve bir artırılır.

Bir şehir listesinden sözlük kullanarak frekans tablosu oluşturma süreci.

Alıştırma — durumları sayın

Aşağıdaki listede "tamam" ve "bekliyor" değerlerinin kaç kez geçtiğini sözlükte sayın.

Beklenen:

{'tamam': 3, 'bekliyor': 2}

get(durum, 0) mevcut sayıyı veya ilk karşılaşmada sıfırı verir.

durumlar = ["tamam", "bekliyor", "tamam", "tamam", "bekliyor"]
sayilar = {}

for durum in durumlar:
    sayilar[durum] = sayilar.get(durum, 0) + 1

print(sayilar)

Küme (set): tekrarsız değerler

Bir küme her değeri bir kez tutar:

etiketler = {"python", "web", "python", "veri"}

print(etiketler)

Kümede "python" yalnızca bir kez bulunur.

Bir listeyi kümeye dönüştürmek de mümkündür:

sehirler = ["Samsun", "Ordu", "Samsun", "Amasya"]
benzersiz = set(sehirler)

print(benzersiz)

Küme, benzersiz değerleri bulmak istediğimizde kullanışlıdır.

Sözlüğün anahtar-değer eşlemesi ile kümenin tekrarsız değer tutma özelliğini karşılaştıran şema.
Note

Kümeyi indeksle sıralı bir yapı gibi kullanmayın. kume[0] biçiminde erişim yoktur. Eğer sıra problem için önemliyse liste daha uygun olabilir.

Kümede üyelik kontrolü

Kümeler üyelik kontrolü için doğal bir yapıdır:

izinli_roller = {"ogrenci", "personel", "misafir"}

rol = "personel"

if rol in izinli_roller:
    print("Rol tanımlı")

Eleman eklemek için add():

izinli_roller.add("yonetici")

Tahmin et — kaç benzersiz değer var?

İlk uzunluk 6, benzersiz değer sayısı 4 olur.

Alıştırma — tekrar eden kayıtları azaltın

Aşağıdaki ders kodlarından benzersiz olanları küme olarak elde edin.

Beklenen benzersiz değer sayısı 3tür.

set(dersler) listedeki tekrarları kaldırarak küme üretir.

dersler = ["BLP101", "BLP102", "BLP101", "BLP103", "BLP102"]

benzersiz_dersler = set(dersler)

print(benzersiz_dersler)
print(len(benzersiz_dersler))

Hangi koleksiyonu seçmeliyim?

Tek bir “en iyi” koleksiyon yoktur. Veriyle ne yapmak istediğimiz önemlidir.

İhtiyaç Genellikle uygun yapı
Sıralı bir değer dizisi list
Küçük ve değişmemesi beklenen sıralı grup tuple
Anlamlı anahtardan değere erişim dict
Tekrarsız değerler ve üyelik kontrolü set

Örnekler:

  • Bir öğrencinin haftalık puanları → liste
  • Bir koordinat çifti → demet
  • Bir ürünün ad, fiyat, stok alanları → sözlük
  • Sistemde görülen benzersiz hata kodları → küme
Tip

Koleksiyonu verinin “nasıl göründüğüne” göre değil, programın veriye nasıl erişeceğine ve ne yapacağına göre seçin.

Liste ve sözlüğü birlikte kullanmak

Birden fazla ürün kaydı tutmak için her ürünü sözlük, kayıtların tamamını liste yapabiliriz:

urunler = [
    {"ad": "Kalem", "fiyat": 12.5},
    {"ad": "Defter", "fiyat": 45},
    {"ad": "Silgi", "fiyat": 8}
]

for urun in urunler:
    print(urun["ad"], urun["fiyat"])

Bu yapı gelecek haftanın ana konusudur: birden fazla kayıt üzerinde filtreleme, gruplama ve özetleme.

Üret — basit stok özeti

Bir stok sözlüğünde ürün kodları anahtar, stok miktarları değer olsun:

stoklar = {
    "KLM": 12,
    "DFT": 0,
    "SLG": 8,
    "CTN": 0
}

stok_ozeti(stoklar) adlı fonksiyon:

  • toplam stok miktarını,
  • stoku 0 olan ürün sayısını

hesaplayıp (toplam_stok, tukenen_urun_sayisi) demeti olarak döndürsün.

Başlangıç:

Beklenen:

(20, 2)

for miktar in stoklar.values(): biçiminde değerler üzerinde gezinebilirsiniz.

def stok_ozeti(stoklar):
    toplam_stok = 0
    tukenen_urun_sayisi = 0

    for miktar in stoklar.values():
        toplam_stok = toplam_stok + miktar
        if miktar == 0:
            tukenen_urun_sayisi = tukenen_urun_sayisi + 1

    return toplam_stok, tukenen_urun_sayisi

stoklar = {
    "KLM": 12,
    "DFT": 0,
    "SLG": 8,
    "CTN": 0
}

print(stok_ozeti(stoklar))

Bölüm özeti

Bu hafta koleksiyon seçimimizi problem ihtiyacına göre genişlettik.

  • Sözlük anahtar–değer ilişkileri tutar.
  • sozluk["anahtar"] değere doğrudan erişir.
  • Bir anahtara yeniden atama yapmak değeri günceller.
  • get() eksik anahtarda varsayılan değer kullanmaya izin verir.
  • items() anahtar ve değeri birlikte dolaşmayı sağlar.
  • Sözlük, frekans veya sayaç tablosu oluşturmak için uygundur.
  • Küme tekrarsız değerler tutar ve sıralı indeks yapısı değildir.
  • set(liste) benzersiz değerleri elde etmek için kullanılabilir.
  • in, kümede üyelik kontrolü için doğal bir işlemdir.
  • Liste, demet, sözlük ve küme farklı erişim ihtiyaçlarına hizmet eder.

Kendinizi kontrol edin

  1. urun["fiyat"] ifadesindeki "fiyat" nedir?
  2. Olmayan bir anahtara sozluk["x"] ile erişmenin sonucu ne olabilir?
  3. get("x", 0) ne yapar?
  4. items() hangi iki bilgiyi birlikte verir?
  5. sayilar[deger] = sayilar.get(deger, 0) + 1 kalıbı ne amaçla kullanılır?
  6. Küme neden tekrar eden değerleri tutmaz?
  7. Hangi durumda liste yerine küme seçmek daha anlamlıdır?
  8. Bir ürün kaydı için neden sözlük, yalnızca ürün adlarının sıralı listesi için neden liste daha doğal olabilir?

Bir sonraki bölümde liste ve sözlükleri birlikte kullanarak küçük kayıt kümelerini işleyeceğiz.

Back to top