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şmezsehirler.discard("Hatay")sehirler.discard("Rize") # yok ama hata vermezprint("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 olanlarprint(python_sinifi & r_sinifi) # kesişim: ikisinde de olanlar → Zeynep, Canprint(python_sinifi - r_sinifi) # fark: sadece Python'da olanlar → Ayşe, Mertprint(python_sinifi ^ r_sinifi) # simetrik fark: sadece birinde olanlar → Ayşe, Mert, Elif
| İşaret | Adı | Soru |
|---|---|---|
| | Birleşim | En az birinde olanlar kimler? |
& | Kesişim | İkisinde de olanlar kimler? |
- | Fark | Birincide olup ikincide olmayanlar kimler? |
^ | Simetrik fark | Sadece 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
[3, 1, 3, 2, 1, 5]listesindeki tekrarları kaldır ve sonucu küçükten büyüğe sıralı bir liste olarak yazdır.- 1’den 20’ye kadar olan sayılardan 3’e bölünebilenlerin karelerini liste üreteciyle bul.
- “programlama” ve “algoritma” kelimelerinde ortak olan harfleri bul.
{"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
iffiltreler, baştakiif ... elsedönüştürür. - Aynı yazımla sözlük (
{k: v for ...}) ve küme ({x for ...}) üretilir. - Kümede
inile 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.

Bir yanıt yazın