Giriş — Neden doğru veri yapısını seçmelisiniz?
Python'da liste (list), sözlük (dict) ve set (set) en sık kullanılan temel veri yapılarıdır. Her biri farklı özellikler sunar: listeler sıralıdır ve öğeler tekrar edilebilir; sözlükler anahtar-değer eşlemesi sağlar ve hızlı erişim amaçlıdır; setler ise benzersiz öğeler ve küme işlemleri için uygundur. Resmi dokümantasyon bu yapıların davranışlarını detaylandırır ve örnekler sunar (Python Veri Yapıları).
Hızlı özet: Her bir yapının temel özellikleri
- List (list): Sıralı, değiştirilebilir, elemanlar çoğaltılabilir. İndeksleme ve dilimleme desteklenir.
- Dictionary (dict): Anahtar-değer çiftleri halinde veri saklar; anahtarlar hashlenebilir türlerden olmalıdır. Ortalama erişim hızı yüksektir.
- Set (set): Sırasız, benzersiz öğeler. Kümeler arası işlem (birleşim, kesişim, fark) operasyonları için uygundur. Boş küme oluşturmak için set() kullanılmalıdır ({} boş bir sözlüktür).
Listeler: Temel kullanım ve dikkat edilmesi gerekenler
Listeler sıra bilgisi ve indeksleme gerektiren durumlar için uygundur. Sık kullanılan işlemler append, extend, insert, remove, pop, sort ve dilimlemedir.
Örnekler
# liste oluşturma nums = [1, 2, 3] nums.append(4) print(nums[0]) # 1 print(nums[1:3]) # [2, 3] # liste anlama (list comprehension) squares = [x*x for x in range(5)]
List comprehension ifadeleri genellikle daha kısa ve CPython'da döngülere göre daha verimli çalışır çünkü C seviyesinde optimize edilmiş döngüler kullanılır (kaynak).
Performans notları (list)
| İşlem | Tipik karmaşıklık | Not |
|---|---|---|
| İndeks ile erişim | O(1) | Rastgele erişim hızlıdır. |
| append | O(1) amortize | Sona ekleme genelde sabit zamanlıdır. |
| insert / pop(0) / remove(value) | O(n) | Araya ekleme veya baştan/ortadan kaldırma maliyetlidir. |
| membership (in) | O(n) | Tekil arama lineer zamanlıdır. |
Sözlükler (dict): Hızlı arama ve anahtar-değer yönetimi
Sözlükler anahtar-değer eşlemesi sağlar; anahtarlar hashlenebilir olmalıdır (ör. int, str, tuple). Python'ın modern uygulamalarında dict ekleme sırasını korur ve genel amaçlı hızlı erişim gerekirken tercih edilir (kaynak).
Örnekler
# sözlük oluşturma ve erişim person = {"isim": "Ayşe", "yas": 30} print(person["isim"]) # "Ayşe" # güvenli erişim age = person.get("yas", 0) # değer güncelleme person["sehir"] = "İstanbul" # anahtar değer çiftleri üzerinde döngü for k, v in person.items(): print(k, v)
Performans notları (dict)
- Ortalama durumda anahtar arama, ekleme ve silme O(1) olarak kabul edilir; bunun detayları gömülü türler belgelerinde açıklanır (Gömülü Türler).
- Anahtarlar hashlenebilir olmalıdır; değiştirilebilir (mutable) türler (ör. list) anahtar olarak kullanılamaz.
Setler (set): Benzersizlik ve küme işlemleri
Setler benzersiz öğeler ve yüksek hızlı üyelik testleri için uygundur. Kümeler arası birleşim, kesişim ve fark gibi işlemler kolaylıkla yapılır.
Örnekler
# boş küme oluşturma s = set() # NOT: {} boş bir sözlüktür s.add(1) s.update([2,3]) print(2 in s) # True # küme işlemleri s1 = {1,2,3} s2 = {2,3,4} print(s1 & s2) # kesişim -> {2,3} print(s1 | s2) # birleşim -> {1,2,3,4}
Performans notları (set)
- Üyelik testi (in) genelde O(1)'dir, bu da setleri büyük koleksiyonlarda hızlı kontrol için ideal kılar.
- Setler ve dictler benzer hash tabanlı altyapı kullanır; bu yüzden ortalama performansları benzerdir.
Sıralama ve büyük veri: ne zaman hangi yöntemi seçmeli?
Python'da sıralama için iki ana seçenek vardır: listeyi yerinde değiştiren list.sort() ve yeni bir liste döndüren sorted(). Her ikisi de key parametresi alır; key fonksiyonu her öğe için bir kez çağrılır, bu sayede decorate-sort-undecorate desenine (DSU) çoğu durumda gerek kalmaz (Sıralama Teknikleri).
# örnek: dict listelerini anahtara göre sıralama people = [{"isim": "A", "yas": 30}, {"isim": "B", "yas": 25}] people.sort(key=lambda p: p["yas"]) # yaşa göre artan
Büyük veri setlerinde key hesaplamaları maliyetliyse, key değerlerini önceden hesaplamak veya uygun veri yapıları kullanmak fayda sağlar. Ayrıca mümkünse bellek kullanımını ve algoritma karmaşıklığını göz önünde bulundurun.
Pratik ipuçları ve sık yapılan yanlışlar
- Boş bir küme oluşturmak için set() kullanın; {} sözlük oluşturur.
- İç içe listeler oluştururken paylaşılan referanslara dikkat edin:
matrix = [[0]*3]*3 # tüm satırlar aynı listeyi paylaşır (beklenmedik sonuçlar olabilir) # Doğru yöntem: matrix = [[0]*3 for _ in range(3)]
- Tekrarlayan aramalarda list yerine dict veya set kullanmak genellikle daha hızlıdır (üye kontrolü O(1)).
- Bir elemanın sayısını saymak için dict.get veya collections.Counter kullanabilirsiniz; basit dict ile saymak örneği:
counts = {} for item in items: counts[item] = counts.get(item, 0) + 1
Hızlı tercih rehberi
- Veri sıralı mı ve index gerekliliği var mı? -> list
- Anahtar-değer ilişkisi ve hızlı erişim mi gerekiyor? -> dict
- Tekrarlayan öğeleri kaldırmak veya üyelik testi mi öncelikli? -> set
Kontrol listesi (kod gözden geçirme için)
- Doğru veri yapısını seçtim mi (liste/sözlük/set)?
- Gereksiz kopyalar veya büyük geçici yapı oluşturuyor muyum?
- Döngülerin yerine list comprehension veya uygun yerleşik fonksiyonlar kullanılabilir mi?
- Key fonksiyonları pahalıysa hesaplamayı azaltmanın yolu var mı?
Sonuç
Listeler, sözlükler ve setler Python'da farklı ihtiyaçlara hizmet eder. Hangi yapıyı seçeceğinizi belirlerken erişim modelleri, ekleme/silme ihtiyaçları ve belleğinizi göz önünde bulundurun. Resmi Python belgeleri bu yapıların detaylarını ve örneklerini içerir; daha teknik bilgiler için Veri Yapıları ve Sıralama Teknikleri sayfalarına bakabilirsiniz.
Kaynaklar: Python — Veri Yapıları, Python — Sıralama Teknikleri, Python — Gömülü Türler