Kümeler ve Liste Üreteçleri (Python Dersi 12)

Bir listede kaç farklı eleman var? İki sınıfın ortak öğrencileri kimler? Geçen haftaki alışveriş listesinde olup bu haftakinde olmayanlar hangileri? Bu soruların hepsini döngülerle de çözebilirsin, ama Python’da bunlar için hazır bir veri yapısı var: küme (set). Dersin ikinci yarısında da liste, sözlük ve kümeleri tek satırda kurmanı sağlayan üreteçlere bakacağız.

Kodların hepsi Colab’da hazır: Colab’da Aç

Küme: tekrarsız eleman topluluğu

Küme süslü parantezle yazılıyor ve her elemanı sadece bir kez tutuyor:

sehirler = {"Adana", "Mersin", "Adana", "Hatay"}
print(sehirler) # {'Hatay', 'Adana', 'Mersin'}
print(len(sehirler)) # 3

İki kez yazdığımız Adana bir kez kaldı. Bu özellik en çok bir listedeki tekrarları atmak için kullanılıyor:

ziyaretler = ["Adana", "İzmir", "Adana", "Ankara", "İzmir", "Adana"]
farkli = set(ziyaretler)
print(farkli, len(farkli)) # {'Ankara', 'İzmir', 'Adana'} 3

Kümede sıra yoktur

Çıktıdaki sıranın yazdığımız sırayla aynı olmadığını fark ettin mi? Kümeler sırayı tutmaz; kodu her çalıştırdığında farklı bir sıra bile görebilirsin. Bu yüzden indeksle eleman alamazsın:

sehirler[0]
# TypeError: 'set' object is not subscriptable

Sıralı bir sonuç istiyorsan sorted(sehirler) kullan; sana sıralı bir liste döndürür.

Eklemek, silmek, aramak

sehirler.add("Osmaniye")
sehirler.add("Adana") # zaten var, bir şey değişmez
sehirler.discard("Hatay")
sehirler.discard("Rize") # yok ama hata vermez
print("Mersin" in sehirler) # True

remove da eleman siler, ama eleman yoksa hata verir. discard ise sessizce geçer.

Tuzak: boş küme

bos = set()
print(type(bos), type({})) # <class 'set'> <class 'dict'>

{} boş bir sözlük oluşturur, boş küme değil. Boş küme için set() yazman gerekiyor.

Küme işlemleri

Matematikte gördüğün birleşim, kesişim ve fark işlemleri Python’da tek bir işaretle yapılıyor:

python_sinifi = {"Ayşe", "Mert", "Zeynep", "Can"}
r_sinifi = {"Zeynep", "Can", "Elif"}
print(python_sinifi | r_sinifi) # birleşim: en az birinde olanlar
print(python_sinifi & r_sinifi) # kesişim: ikisinde de olanlar → Zeynep, Can
print(python_sinifi - r_sinifi) # fark: sadece Python'da olanlar → Ayşe, Mert
print(python_sinifi ^ r_sinifi) # simetrik fark: sadece birinde olanlar → Ayşe, Mert, Elif
İşaretAdıSoru
|BirleşimEn az birinde olanlar kimler?
&Kesişimİkisinde de olanlar kimler?
-FarkBirincide olup ikincide olmayanlar kimler?
^Simetrik farkSadece birinde olanlar kimler?

SQL Hazırlık 1 yazısındaki “hiç çalışanı olmayan departmanlar” sorusunu hatırla. Aslında o da bir fark işlemiydi: tüm departmanlar eksi çalışanı olan departmanlar.

Liste üreteci

Liste üretecini kod kartında kısaca görmüştük: bir listeden yeni bir listeyi tek satırda kurmak. Hatırlayalım ve bir adım ileri gidelim:

notlar = [70, 85, 40, 90, 45]
gecenler = [n for n in notlar if n >= 50]
# [70, 85, 90]
artirilmis = [n + 5 for n in notlar]
# [75, 90, 45, 95, 50]
harfler = ["Geçti" if n >= 50 else "Kaldı" for n in notlar]
# ['Geçti', 'Geçti', 'Kaldı', 'Geçti', 'Kaldı']

Son örneğe dikkat: if sona gelirse filtreler (bazı elemanları atar). if ... else başa gelirse dönüştürür (her eleman için iki seçenekten birini seçer, hiçbirini atmaz). Bu ikisini karıştırmak liste üreteçlerindeki en sık hata.

Sözlük ve küme üreteçleri

Aynı yazım süslü parantezle sözlük ve küme de üretiyor:

isimler = ["Ayşe", "Mert", "Zeynep"]
uzunluklar = {isim: len(isim) for isim in isimler}
# {'Ayşe': 4, 'Mert': 4, 'Zeynep': 6}
notlar_sozluk = {"Ayşe": 85, "Mert": 45, "Zeynep": 92}
gecenler = {isim: puan for isim, puan in notlar_sozluk.items() if puan >= 50}
# {'Ayşe': 85, 'Zeynep': 92}
epostalar = ["ayse@gmail.com", "mert@outlook.com", "can@gmail.com"]
alanlar = {e.split("@")[1] for e in epostalar}
# {'gmail.com', 'outlook.com'}

Fark iki noktada: Başta anahtar: değer varsa sözlük, sadece tek bir değer varsa küme üretiyorsun. Son örnekte iki tane gmail.com olmasına rağmen sonuçta bir tane var, çünkü küme tekrarı tutmuyor. split("@")[1] Ders 11’den: e-postayı @ işaretinden böl, ikinci parçayı al.

Mini program: iki listeyi karşılaştırmak

def karsilastir(liste1, liste2):
"""İki listenin ortak, yalnızca birincide ve yalnızca ikincide olan elemanlarını döndürür."""
a, b = set(liste1), set(liste2)
return {
"ortak": sorted(a & b),
"sadece_1": sorted(a - b),
"sadece_2": sorted(b - a),
}
gecen_hafta = ["süt", "ekmek", "yumurta", "peynir", "süt"]
bu_hafta = ["ekmek", "domates", "peynir", "zeytin"]
for ad, liste in karsilastir(gecen_hafta, bu_hafta).items():
print(f"{ad:<9} {liste}")
ortak ['ekmek', 'peynir']
sadece_1 ['süt', 'yumurta']
sadece_2 ['domates', 'zeytin']

Aynı fonksiyonla iki kullanıcının ortak takipçilerini, iki dersin ortak öğrencilerini ya da iki veri dosyası arasında kaybolan kayıtları bulabilirsin. Veri analizinde “Bu iki listede kim var, kim yok?” sorusu sürekli karşına çıkıyor.

Bonus: kümede aramak neden çok hızlı?

Bir listede in ile arama yaptığında Python baştan başlayıp elemanları tek tek kontrol ediyor. Bir milyon elemanlı bir listede son elemanı aramak, bir milyon karşılaştırma demek. Küme ise elemanları özel bir yapıda (hash tablosu) tutuyor ve aranan elemana neredeyse doğrudan gidiyor.

Not defterinde bunu ölçen bir hücre var: Aynı bir milyon sayıyı bir listede ve bir kümede 100 kez aratıyor. Kodu test ederken küme binlerce kat hızlı çıktı; senin bilgisayarında ya da Colab’da sayı farklı olacak, ama fark her zaman çok büyük. Büyük bir veride “bu eleman var mı?” sorusunu çok kez soracaksan küme kullan.

Alıştırmalar

  1. [3, 1, 3, 2, 1, 5] listesindeki tekrarları kaldır ve sonucu küçükten büyüğe sıralı bir liste olarak yazdır.
  2. 1’den 20’ye kadar olan sayılardan 3’e bölünebilenlerin karelerini liste üreteciyle bul.
  3. “programlama” ve “algoritma” kelimelerinde ortak olan harfleri bul.
  4. {"elma": 30, "muz": 45, "kiraz": 80} sözlüğünden fiyatı 40’tan büyük olanları sözlük üreteciyle seç ve fiyatlara %10 zam yap.

Cevaplar Colab not defterinin sonunda.

Bu derste ne öğrendik?

  • Küme her elemanı bir kez tutar ve sıra tutmaz; indeksle eleman alınamaz.
  • Boş küme set() ile kurulur; {} boş sözlüktür.
  • |, &, -, ^ ile birleşim, kesişim, fark ve simetrik fark alınır.
  • Liste üretecinde sondaki if filtreler, baştaki if ... else dönüştürür.
  • Aynı yazımla sözlük ({k: v for ...}) ve küme ({x for ...}) üretilir.
  • Kümede in ile arama, listede aramaktan çok daha hızlıdır.

Sıradaki ders

Python Dersi 13’te programlarımızın hata karşısında çökmemesini sağlıyoruz: try ve except.

Devamını oku


Hatice Özbolat | Teknoloji ve AI Rehberi sitesinden daha fazla şey keşfedin

Son gönderilerin e-postanıza gönderilmesi için abone olun.

Comments

Bir yanıt yazın