Dict comprehension, Python'da bir sözlüğü tek satırda, döngü ve atama işlemlerini iç içe geçirerek oluşturmanın yoludur. Klasik bir for döngüsünde birkaç satır tutan "boş sözlük aç, döngüde gez, anahtar-değer ekle" mantığını tek ifadeye sıkıştırır. Sonuç olarak hem daha az kod yazılır hem de niyet daha net görünür: bu yapı bir sözlük üretmek için var. Orta seviyeye geçen bir Python öğrencisi için dict comprehension, kodun okunabilirliğini artıran ama yanlış kullanıldığında tam tersi etki yapabilen bir araçtır — bu yazıda hem doğru kullanım örneklerini hem de sınırlarını göreceksiniz.
Dict Comprehension Nedir? Temel Söz Dizimi ve Çalışma Mantığı
En basit haliyle bir örnekle başlayalım. Aşağıdaki kod, 1'den 5'e kadar olan sayıları anahtar, karelerini ise değer olarak tutan bir sözlük oluşturur:
kareler = {sayi: sayi ** 2 for sayi in range(1, 6)}
print(kareler)
# Çıktı: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
Bu tek satır, aslında dört farklı parçadan oluşur ve Python bunları belirli bir sırayla işler. Genel kalıp şöyledir:
{key_ifadesi: value_ifadesi for item in iterable}
Parçaları tek tek açalım:
- iterable kaynağı:
range(1, 6)gibi üzerinde gezilebilen herhangi bir dizi, liste, tuple veya başka bir sözlük olabilir. - for döngüsü kısmı:
for sayi in range(1, 6), tıpkı klasik bir döngüde olduğu gibi iterable'daki her öğeyi sıraylasayideğişkenine atar. - key ifadesi:
sayi, her döngü adımında oluşacak sözlük anahtarını belirler. - value ifadesi:
sayi ** 2, aynı adımda o anahtara karşılık gelecek değeri hesaplar.
Python bu yapıyı çalıştırırken arka planda tam olarak bir for döngüsü döndürür: iterable'daki her öğe için önce key ve value ifadeleri hesaplanır, ardından bu çift sonuç sözlüğüne eklenir. Yani dict comprehension yeni bir mekanizma değil, var olan döngü mantığının daha derli toplu bir sözdizimiyle ifade edilmiş hâlidir. Bu nedenle bir dict comprehension yazarken kendinize her zaman "bu satırı klasik döngüyle nasıl yazardım?" diye sormak, yapıyı çözmenin en pratik yoludur. İlerleyen bölümlerde bu iki yaklaşımı doğrudan karşılaştırarak farkları somutlaştıracağız.
Klasik For Döngüsü ile Dict Comprehension: Yan Yana Karşılaştırma

Aynı sonucu üreten iki farklı yaklaşımı görmek, dict comprehension'ın ne kazandırdığını netleştirir. Önce klasik for döngüsüyle bir öğrenci-not sözlüğü oluşturalım:
isimler = ["Ali", "Ayşe", "Mert"]
notlar = [85, 92, 78]
sonuc = {}
for i in range(len(isimler)):
sonuc[isimler[i]] = notlar[i]
print(sonuc)
Şimdi aynı işi dict comprehension ile yapalım:
isimler = ["Ali", "Ayşe", "Mert"]
notlar = [85, 92, 78]
sonuc = {isim: not_ for isim, not_ in zip(isimler, notlar)}
print(sonuc)
İkinci örnek hem daha kısa hem de zip sayesinde indeks takibi gerektirmiyor; bu konuyu bir sonraki bölümde daha ayrıntılı ele alacağız. Burada dikkat edilmesi gereken nokta, dict comprehension'ın satır sayısını azaltırken mantığı değiştirmemesidir — sadece aynı döngüyü daha yoğun bir sözdiziminde ifade eder. Performans açısından da genel eğilim, comprehension yapılarının çoğu senaryoda klasik döngüye kıyasla en azından eşdeğer, çoğunlukla biraz daha hızlı çalışmasıdır; ancak bu fark kod okunabilirliğinin önüne geçecek bir gerekçe olarak görülmemelidir.
Bu tür temel sözlük ve döngü kalıplarını pekiştirmek isteyenler için birebir Python dersleri kapsamında bu tür yapılar canlı örneklerle uygulamalı şekilde işlenir. Aşağıdaki tablo, iki yaklaşımı dört farklı kriterde karşılaştırıyor:
| Kriter | For Döngüsü | Dict Comprehension |
|---|---|---|
| Okunabilirlik | Basit mantıkta bile açık ve adım adım izlenebilir | Kısa ifadelerde net, karmaşık ifadelerde zorlaşabilir |
| Performans | Genellikle yeterli, ekstra atama satırları içerir | Çoğu senaryoda benzer veya biraz daha hızlı çalışır |
| Kullanım senaryosu | Çok adımlı, birden fazla işlem gerektiren dönüşümler | Tek adımlı, doğrudan key-value üretimi |
| Hata ayıklama kolaylığı | Ara değerleri satır satır print ile izlemek kolay | Tek satır olduğu için ara adımları izlemek zorlaşır |
Koşullu Dict Comprehension: Filtreleme ve if-else ile Değer Belirleme
Dict comprehension'ın gerçek gücü, koşul ekleyebilmesinde ortaya çıkar. İki farklı senaryoyu ayırmak önemlidir: yalnızca belirli öğeleri sözlüğe almak (filtreleme) ve her öğeyi almak ama değerini koşula göre değiştirmek. İlk örnek, yalnızca çift sayıları sözlüğe alan bir filtreleme:
sayilar = range(1, 11)
cift_kareler = {sayi: sayi ** 2 for sayi in sayilar if sayi % 2 == 0}
print(cift_kareler)
# Çıktı: {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}
Burada if sayi % 2 == 0 ifadesi döngünün sonuna eklenir ve yalnızca koşulu sağlayan öğeler sözlüğe dahil edilir; koşulu sağlamayanlar tamamen atlanır. İkinci örnekte ise tüm sayılar sözlüğe alınır ama değeri koşula göre değişir:
sayilar = range(1, 11)
durum = {sayi: ("çift" if sayi % 2 == 0 else "tek") for sayi in sayilar}
print(durum)
# Çıktı: {1: 'tek', 2: 'çift', 3: 'tek', ..., 10: 'çift'}
Buradaki kritik fark sözdiziminde gizlidir: filtreleme yapan if ifadesi döngünün en sonuna, koşula göre değer belirleyen if-else ise value ifadesinin içine, döngüden önce yazılır. Bu iki yapıyı karıştırmak sık yapılan bir hatadır; if tek başına kullanıldığında filtre görevi görür, if-else birlikte kullanıldığında ise her öğe için bir değer üretimi görevi görür ve hiçbir öğe elenmez. Bu ayrımı netleştirmek için ikisini aynı satırda birleştirmemek, her comprehension'ın tek bir amaca hizmet etmesini sağlamak okunabilirlik açısından önemlidir.
Bu tür koşullu yapılar, temel Python bilginizin ne kadar sağlam olduğunu gösteren pratik örneklerdendir; kendi seviyenizi görmek isterseniz ücretsiz kodlama bilgisi testi ile hızlıca ölçebilirsiniz. Koşullu comprehension'lar özellikle veri temizleme, filtreleme ve etiketleme gibi günlük kod yazma senaryolarında sıkça karşınıza çıkar.
Zip ile İki Iterable'dan Sözlük Oluşturma: Pratik Bir Senaryo
Elinde iki ayrı liste varsa ve bunları birebir eşleştirerek bir sözlüğe dönüştürmek istiyorsan, aradığın araç zip() fonksiyonudur. zip(), iki iterable'ı aynı anda dolaşarak elemanları sırayla eşler; dict comprehension ile birleştiğinde tek satırda okunaklı bir sözlük üretimi sağlar. Bu, gerçek projelerde en sık karşılaşılan sözlük oluşturma senaryolarından biridir.
Örneğin bir sınıftaki öğrenci isimlerini ve bu öğrencilerin sınav puanlarını iki ayrı listede tutuyor olabilirsin. Amaç, hangi öğrencinin kaç puan aldığını hızlıca sorgulayabileceğin bir yapı kurmak. İşte tam burada zip() ile dict comprehension devreye girer:
isimler = ["Ayşe", "Mert", "Elif", "Can"]
puanlar = [88, 74, 95, 61]
ogrenci_notlari = {isim: puan for isim, puan in zip(isimler, puanlar)}
print(ogrenci_notlari)
# {'Ayşe': 88, 'Mert': 74, 'Elif': 95, 'Can': 61}
Burada zip(isimler, puanlar) her adımda bir isim ve bir puanı bir arada bir demet (tuple) olarak döndürür; comprehension da bu demeti isim ve puan değişkenlerine ayırarak sözlüğe anahtar-değer çifti olarak yazar. Sonuç, klasik bir for döngüsüyle üç dört satırda yazılacak bir işlemin tek satıra sığmış hâlidir.
Bu desenin kullanım alanı sadece not tablolarıyla sınırlı değil; ürün adı ile fiyatını eşleştirmek, kullanıcı adı ile e-posta adresini birleştirmek ya da sütun başlıklarıyla bir satırdaki değerleri eşleyerek küçük bir kayıt oluşturmak gibi pek çok senaryoda aynı mantık işler. Önemli olan iki listenin sırasının ve uzunluğunun birbiriyle tutarlı olmasıdır; zip() en kısa listeye göre durduğu için uzunluklar eşit değilse veri kaybı yaşanabileceğini akılda tutmak gerekir. Bu tür pratik kalıpları adım adım örneklerle pekiştirmek istiyorsan, Python üzerine hazırlanmış yazı dizisi içinde benzer gerçek hayat senaryolarına daha geniş yer ayrılmıştır.
Okunabilirlik Sınırı: Dict Comprehension Ne Zaman Anti-Pattern Olur?

Dict comprehension'ın en büyük gücü kısalığıdır, ama bu güç bir sınırı aştığında tam tersine dönüşür ve kodu okunmaz hâle getirir. Bir comprehension satırı ekranın genişliğini aşacak kadar uzuyorsa ya da tek bakışta ne yaptığını anlamak için iki kez okumak gerekiyorsa, bu artık bir kısayol değil, bir gizleme aracıdır. Genel kabul gören pratik ölçüt, bir satırın yaklaşık 80-100 karakteri geçmemesi ve içinde birden fazla mantıksal adımın üst üste binmemesidir.
Somut olarak şu durumlarda klasik for döngüsüne dönmek daha doğru bir tercihtir:
- Satır, okuyucunun ekranın dışına taşan bir ifadeyi zihinde bölmesini gerektiriyorsa.
- Tek bir
ifyerine birbirine bağlı birden fazla koşul iç içe geçmişse. - Anahtar veya değer üretimi tek bir işlem değil, birden fazla ara adımdan (dönüştürme, doğrulama, hesaplama) oluşuyorsa.
- Hata ayıklarken hangi adımda sorun çıktığını görmek için satırı parçalara ayırman gerekiyorsa.
Bu noktada özellikle bir kalıptan bahsetmek gerekir: iç içe geçmiş (nested) comprehension'lar. Bir comprehension'ın içine başka bir comprehension yerleştirmek, kısa yazmak uğruna okunabilirliği tamamen feda etmek anlamına gelir; kodu yazan kişi dışında kimsenin ilk bakışta çözemeyeceği bir bulmacaya dönüşür ve bu nedenle çoğu ekipte açık bir anti-pattern olarak kabul edilir. Kısalık, doğru yazılmış kodun sonucu olmalı, amacı olmamalı.
Mantık birden fazla adım içeriyorsa en sağlıklı çözüm, o mantığı isimli bir fonksiyona taşımaktır. Böylece comprehension içinde sadece {anahtar: fonksiyon(deger) for deger in veri} gibi sade bir çağrı kalır, karmaşık iş mantığı ise ayrı ve test edilebilir bir fonksiyonun içinde yaşar. Bu tür tasarım kararlarını gerçek kod üzerinde, birebir geri bildirimle çalışarak içselleştirmek istersen, bire bir Python dersleri tam da bu ayrım noktalarını örneklerle netleştirmeyi hedefler.
List Comprehension ile Dict Comprehension Arasındaki Temel Fark
List comprehension ile dict comprehension aynı zihinsel kalıptan doğar ama ürettikleri şey farklıdır. List comprehension köşeli parantez [] kullanır ve döngü her adımda tek bir değer üretir; sonuçta elinde sıralı bir liste kalır. Dict comprehension ise süslü parantez {} kullanır ve her adımda anahtar: değer biçiminde bir çift üretir; sonuçta elinde anahtarlarla sorgulanabilen bir sözlük olur. Yani fark sadece parantez tipinde değil, üretilen verinin yapısındadır: biri tekil eleman dizisi, diğeri ilişkisel bir eşleme kurar.
Bu fark, hangi durumda hangisini seçeceğini de belirler. Elindeki veriyi sırayla işleyip yeni bir dizi elde etmek istiyorsan list comprehension yeterlidir; ama veriye bir anahtar üzerinden hızlıca erişmen, iki listeyi eşlemen ya da bir kayıt kümesini isimlendirilmiş alanlarla temsil etmen gerekiyorsa dict comprehension doğru araçtır. İki yapıyı birbirinin yerine kullanmaya çalışmak, gereksiz dönüşüm adımlarına ve okunması zor koda yol açar. Bu iki kalıp arasındaki farkı pekiştirmek ve kendi seviyeni ölçmek istersen, ücretsiz Python bilgi testi ile hızlı bir kontrol yapabilirsin.
Dict Comprehension'ı Günlük Kodda Doğru Kullanmak İçin Pratik İpuçları
Dict comprehension'ı gerçek projelerde sürdürülebilir biçimde kullanmanın sırrı, onu bir "gösteriş aracı" değil bir "netlik aracı" olarak görmekten geçer. Orta seviyeye geçen bir öğrenci için asıl kazanım, tek satırlık kod yazmak değil; hangi durumda tek satırın okunabilirliği artırdığını, hangi durumda azalttığını ayırt edebilmektir. Aşağıdaki alışkanlıklar, bu ayrımı günlük kodlama pratiğine yerleştirmenize yardımcı olur.
- Anlamlı değişken adı kullanın:
{k: v for k, v in ...}yazmak yerine döngü değişkenlerineurun_adi,fiyatgibi bağlama uygun isimler verin; comprehension kısalsa da isimler belirsiz olursa okuyan kişi anlamı çözmek için zaman kaybeder. - Tek satırda birden fazla iş yapmaktan kaçının: Bir comprehension içinde hem filtreleme, hem karmaşık dönüşüm, hem de iç içe koşul barındırıyorsanız bu bir uyarı işaretidir; satırı ikiye bölmek genellikle daha sağlıklıdır.
- Gerekirse yardımcı fonksiyon kullanın: Değer üretim mantığı birkaç satırı geçiyorsa bu mantığı ayrı bir fonksiyona taşıyıp comprehension içinde yalnızca o fonksiyonu çağırın; böylece hem test edilebilir hem okunabilir kod elde edersiniz.
- Önce yazıp sonra sadeleştirme alışkanlığı edinin: Mantığı önce klasik
fordöngüsüyle kurup çalıştığından emin olun, ardından uygunsa dict comprehension'a dönüştürün; bu sıra, hataları comprehension söz dizimi içinde ayıklamaya çalışmaktan çok daha az yorucudur. - Satır uzunluğunu kontrol edin: Comprehension bir ekran genişliğini aşıyorsa parantez içinde birden fazla satıra bölün veya doğrudan döngüye geri dönün.
Bu alışkanlıklar zamanla otomatikleşir ve kodunuzu yalnızca çalışan değil, başka bir geliştiricinin de hızla anlayabileceği hale getirir. Python'da orta seviyeye geçiş süreci aslında büyük ölçüde bu tür karar mekanizmalarını içselleştirmekle ilgilidir: hangi aracı ne zaman kullanacağını bilmek, o aracı ezbere uygulamaktan daha değerlidir. Bu tür pratik karar noktalarını fark etmek, kişinin yazılım kariyerinde hangi yönde ilerlemek istediğini netleştirmesine de katkı sağlar; isterseniz ücretsiz kariyer yönelim testi ile kendi güçlü yönlerinizi keşfedebilirsiniz.
Sık Sorulan Sorular
Dict comprehension nedir ve normal for döngüsünden farkı nedir?
Dict comprehension, bir iterable üzerinden geçerek anahtar-değer çiftlerinden oluşan bir sözlüğü tek bir ifadeyle üreten Python söz dizimidir. Klasik for döngüsünden farkı, boş sözlük tanımlama ve .update() ya da atama satırlarına gerek duymadan üretim mantığını tek satırda toplamasıdır; sonuç olarak elde edilen sözlük aynıdır, değişen yalnızca yazım biçimidir.
Dict comprehension her zaman for döngüsünden daha mı hızlıdır?
Genellikle biraz daha hızlıdır çünkü Python yorumlayıcısı içeride döngü gövdesini daha optimize biçimde çalıştırır, ancak bu fark çoğu günlük senaryoda gözle görülür bir performans avantajı yaratmaz. Seçim kriteri performanstan çok okunabilirlik ve kodun basitliği olmalıdır.
Dict comprehension içinde hem filtreleme hem değer belirleme aynı anda yapılabilir mi?
Evet, bir if ifadesiyle eleman filtrelenebilir, bir if-else ifadesiyle de değer koşula göre belirlenebilir; hatta bu ikisi aynı comprehension içinde birlikte kullanılabilir. Ancak mantık karmaşıklaştıkça bu yapıyı basit tutmak ve gerekirse yardımcı bir fonksiyona bölmek okunabilirlik açısından önemlidir.
İç içe (nested) dict comprehension kullanmak mantıklı mıdır?
Söz dizimi olarak mümkün olsa da genellikle önerilmez, çünkü iç içe yapı tek satırda birden fazla döngü ve koşul mantığını bir araya getirdiğinden okunabilirliği ciddi ölçüde azaltır. Bu tür durumlarda klasik iç içe for döngüleri veya ayrı fonksiyonlara bölünmüş bir çözüm, kodun bakımını çok daha kolay hale getirir.
Dict comprehension ile list comprehension arasındaki fark nedir?
List comprehension köşeli parantez kullanır ve tek bir değerler listesi üretirken, dict comprehension süslü parantez içinde anahtar: değer çifti tanımlayarak bir sözlük üretir. İkisinin temel mantığı aynıdır; fark, üretilen veri yapısının şekli ve söz diziminin buna göre uyarlanmasıdır.
Zip fonksiyonu ile dict comprehension nasıl birlikte kullanılır?
zip(), iki ayrı listeyi (örneğin anahtar listesi ve değer listesi) eşleştirerek tek bir iterable haline getirir; bu iterable dict comprehension içinde for anahtar, deger in zip(liste1, liste2) biçiminde döngüye alınarak iki listeden tek bir sözlük üretilebilir. Bu, özellikle iki paralel veri kaynağını birleştirirken sık kullanılan pratik bir kalıptır.
Bir dict comprehension ne zaman okunabilirliği bozar, ne zaman klasik döngüye dönmeliyim?
Comprehension bir ekran genişliğini aşıyorsa, birden fazla iç içe koşul veya döngü içeriyorsa ya da anlaşılması için birkaç kez okunması gerekiyorsa bu bir anti-pattern işaretidir. Böyle durumlarda kodu klasik for döngüsüne açmak, hem hata ayıklamayı hem de başka bir geliştiricinin kodu anlamasını kolaylaştırır.
Dict comprehension, doğru yerde kullanıldığında Python kodunuzu hem daha kısa hem de daha net hale getiren güçlü bir araçtır; ancak her aracın olduğu gibi bunun da sınırlarını bilmek, sınırsızca kullanmaktan çok daha değerlidir. Bu tür sözdizimsel araçları gerçek projeler üzerinde adım adım pekiştirmek isteyenler için 1-1 özel Python dersleri pratik geri bildirimle bu alışkanlıkların kalıcı hale gelmesine yardımcı olabilir.