Giriş
Python Veri Yapıları—listeler, sözlükler ve setler—sık kullanılan, yerleşik koleksiyon tipleridir. Her biri farklı gereksinimler için tasarlanmıştır: sıralı depolama, anahtar–değer eşleştirmesi ve benzersizlik/üye testi gibi. Aşağıda her yapının ne zaman tercih edileceği, pratik örnekler, dikkat edilmesi gereken noktalar ve basit performans ölçümleri yer alır. Daha fazla teknik detay için Python'ın resmi dokümantasyonuna bakabilirsiniz: Python Veri Yapıları (Tutorial) ve Yerleşik Türler — stdtypes.
Hızlı Karşılaştırma
| Yapı | Temel Özellik | Tipik Kullanım |
|---|---|---|
| Liste (list) | Sıralı, değiştirilebilir, yinelenen elemanlara izin verir | Sıralama, indeksleme, kuyruğa/stack'e benzer işlemler |
| Sözlük (dict) | Anahtar–değer eşleştirmesi; anahtar bazlı erişim | Hızlı arama, yapılandırılmış veriler, lookup tabloları |
| Set (set) | Sırasız, benzersiz elemanlar; küme işlemleri | Üyelik testi, benzersizlik, küme mantığı (birleşim, kesişim) |
Listeler — Ne zaman ve nasıl kullanılır?
Listeler sıralı koleksiyonlar için uygundur. Öğelere indeks ile hızlı erişim, sıralama ve dilimleme (slice) gibi işlemler yapılabilir. Aşağıda temel kullanım örnekleri bulunmaktadır.
numbers = [1, 2, 3, 4]
numbers.append(5)
numbers.insert(2, 99)
last = numbers.pop() # sondaki elemanı çıkarır
numbers[1] = 10
squares = [x*x for x in numbers]
Önemli noktalar:
- Liste dilimleme ve comprehension'lar, kısa ve okunaklı veri dönüşümleri sağlar.
- Liste yöntemleri (append, extend, insert, pop, remove, sort, reverse) sık kullanılır; detaylar için Python dokümantasyonundaki ilgili bölüme bakın: Listeler — Python dokümantasyonu.
Sözlükler — Anahtar/değer eşleştirmesi
Sözlükler (dict) anahtar–değer çiftlerini saklamak için kullanılır. Anahtarlar genellikle hash'lenebilir (değişmez) türlerdir; bu sayede anahtar bazlı erişim verimlidir.
person = {"ad": "Ayşe", "yaş": 30}
person["şehir"] = "İstanbul"
age = person.get("yaş") # anahtar yoksa None döner veya varsayılan verilir
for k, v in person.items():
print(k, v) # Python 3.9 ve sonrası: sözlük birleştirme
# merged = dict1 | dict2
Sözlüklerle ilgili dikkat edilmesi gerekenler:
- Anahtar olarak kullanılan nesneler hashlenebilir olmalıdır (ör. str, int, tuple).
- Sözlük görünümleri (keys(), values(), items()) gerçek kopya değil, dinamik görünüm sağlar; yine belgelere bakabilirsiniz: dict — stdtypes.
Setler — Benzersizlik ve küme işlemleri
Set, tekrarlı elemanları otomatik olarak çıkarır ve üyelik testleri ile küme işlemleri için uygundur.
unique = set([1, 2, 2, 3]) # -> {1, 2, 3}
unique.add(4)
unique.discard(2)
if 3 in unique:
print("3 var") # Küme işlemleri
a = {1,2,3}
b = {2,3,4}
union = a | b
intersection = a & b
difference = a - b
Set kullanırken:
- Set elemanları hashlenebilir olmalıdır; bu nedenle list gibi değiştirilebilir türler doğrudan eklenemez (TypeError oluşur).
- Setler sırasızdır; elemanların depolandığı sıra garantilenmez.
Performans karşılaştırması ve ölçüm
Genel kural olarak, anahtar veya üyelik aramaları söz konusu olduğunda sözlükler ve setler listeye göre daha uygundur. Listeler ise sıralı veri ve indeksleme gerektiren durumlar için uygundur. Bu davranışın detayları ve nedenleri Python belgelerinde yer almaktadır; daha fazla bilgi için bakınız: Python Veri Yapıları.
Aşağıda listede ve sette üyelik testini karşılaştırmak için basit bir timeit örneği var. Bu örneği kendi verinizle çalıştırarak farklı büyüklükler için karşılaştırma yapabilirsiniz.
import timeit setup = "lst = list(range(1000000)); s = set(lst)" stmt_list = "999999 in lst" stmt_set = "999999 in s" print(timeit.timeit(stmt=stmt_list, setup=setup, number=1000)) print(timeit.timeit(stmt=stmt_set, setup=setup, number=1000))
Bu kodu çalıştırdığınızda genelde set üzerinde yapılan üyelik testlerinin daha hızlı olduğunu görürsünüz; ancak mutlak süreler veri boyutuna, Python sürümüne ve donanımınıza bağlı olarak değişir. Kendi senaryonuz için mutlaka ölçüm yapın.
Pratik ipuçları ve kurallar
- Eğer koleksiyonda aynı öğeden birden fazla olabilir ve sıra önemliyse list kullanın.
- Eğer benzersizlik ve hızlı üyelik testi gerekiyorsa set daha uygundur.
- Anahtar–değer erişimi gerekiyorsa dict tercih edin.
- Tek satırda filtreleme veya dönüştürme için comprehension yapıları hem okunaklı hem etkilidir.
- Büyük veri ve sık arama durumlarında kendi verinizi temsil eden benchmarklar hazırlayın; genel kurallar her zaman en iyi sonucu vermez.
Dönüşümler ve birlikte kullanım örnekleri
Koleksiyonlar arasında sık dönüşüm yapılır. Örnekler:
# Bir listeden benzersiz eleman sayısı uniq_count = len(set(my_list)) # Sözlüğün anahtarlarını listeye almak keys = list(my_dict) # İki listeden fark/ortak eleman bulma set_a = set(list_a) set_b = set(list_b) common = set_a & set_b
Yaygın hatalar ve dikkat edilmesi gerekenler
- Set veya dict anahtarı olarak değiştirilebilir (mutable) nesneler kullanmaya çalışmak TypeError ile sonuçlanır. Bu durumda tuple veya frozenset gibi hashlenebilir karşılıklar kullanılabilir.
- Setlerin sırasız olduğunu unutmayın; sıralama gerekiyorsa set -> list -> sort adımları gerekebilir.
- Sözlüğün görünüm nesnelerine (keys(), items()) doğrudan referans verildiğinde, temel sözlük değişirse görünüm de güncellenir—buna dikkat edin.
Nasıl test etmelisiniz: kısa kontrol listesi
- 1) Örneğinizi temsil eden gerçek veri örneğiyle test hazırlayın.
- 2) timeit veya benzeri araçlarla tipik işlemleri ölçün.
- 3) Okunabilirlik ve bakım kolaylığı performansla dengelenmelidir.
- 4) Elde ettiğiniz sonuçları farklı Python sürümlerinde test edin (ör. 3.9, 3.12, 3.13 farkları olabilir).
Kaynaklar ve daha fazla okuma
Resmi dokümantasyon en güvenilir referanstır. Aşağıdaki kaynaklar makaledeki kavramların dayanağını sağlar:
- 5. Veri Yapıları — Python 3.13.11 belgelendirmesi (tutorial)
- Yerleşik Türler — Python 3.12.13 belgelendirmesi (stdtypes)
Özet
Python Veri Yapıları arasında tercih yaparken amacınızı (sıra, benzersizlik, anahtar–değer eşleştirmesi) ve performans gereksinimlerinizi göz önünde bulundurun. Listeler sıralı veri için, sözlükler anahtar–değer eşlemeleri için ve setler benzersiz elemanlar ile küme işlemleri için uygundur. Kendi yükünüzü ölçmek her zaman en sağlıklı yaklaşımdır.