Giriş
Python'da list, dict ve set en sık kullandığınız veri yapılarıdır. Her biri farklı ihtiyaçlara cevap verir: list sıralı koleksiyonlar için uygundur, dict anahtar-değer eşlemeleri sunar, set ise benzersiz öğe ve kümelerle ilgili işlemleri kolaylaştırır. Aşağıda her birinin ne olduğu, temel kullanım örnekleri, performans açısından hangi durumlarda öne çıktıkları ve pratik seçim rehberi bulunuyor (kaynak: Python Tutorial — Data Structures, collections — Python Library).
Temel tanımlar ve kısa örnekler
Listeler (list)
Listeler sıralı ve değiştirilebilir koleksiyonlardır. Aynı öğe birden fazla kez bulunabilir. Sık kullanılan işlemler: ekleme, indeksleme, dilimleme ve liste üretimleri (list comprehensions).
Örnek:
my_list = [1, 2, 3]
my_list.append(4) # [1, 2, 3, 4]
val = my_list[1] # 2
slice = my_list[1:3] # [2, 3]
comp = [x*2 for x in my_list if x%2==0] # [4, 8] (örnek)
Sözlükler (dict)
Dict, anahtar-değer (key:value) çiftleri tutar. Anahtarlar benzersiz olmalıdır. Sık erişim gerektiğinde, anahtarla doğrudan veri almak için uygundur.
Örnek:
my_dict = {'a': 1, 'b': 2}
my_dict['c'] = 3
val = my_dict.get('x', 0) # varsayılan değer kullanımı
items = list(my_dict.items()) # [('a',1), ('b',2), ('c',3)]
Kümeler (set)
Set'ler sırasız, benzersiz öğeler içerir. Aynı elemandan yalnızca bir kez saklanır. Kümeler, üyelik testleri ve kümeler arası işlemler (birleşim, kesişim, fark) için etkilidir.
Örnek:
s = set([1, 2, 2, 3]) # {1, 2, 3}
s.add(4)
others = {3, 4, 5}
union = s | others # {1,2,3,4,5}
intersection = s & others # {3,4}
Not: Boş bir küme oluşturmak için set() kullanılmalıdır; {} ifadesi boş bir sözlük oluşturur (kaynak: Python Tutorial — Data Structures).
Performans: kısa ve kullanışlı karşılaştırma
Aşağıdaki tablo, pratikte hangi veri yapısının hangi tür işlem için daha uygun olduğunu özetler. Burada "hızlı/daha yavaş" gibi nitel ifadeler Python belgelerinde belirtilen tipik davranışlara dayanır; kesin zaman karmaşıklıkları çalışma koşullarına ve versiyona göre değişebilir.
| İşlem | list | dict | set |
|---|---|---|---|
| İndeks ile erişim | Hızlı (sıralı, indeksleme uygundur) | N/A (anahtarla erişim) | N/A |
| Sona ekleme | Hızlı | Hızlı (yeni anahtar ekleme) | Hızlı (add) |
| Üyelik testi (in) | Daha yavaş (liste taranır) | Hızlı (anahtar tabanlı erişim) | Hızlı (hash tabanlı) |
| Tekrarlayan öğeler | İzinli | Anahtarlar benzersiz | Otomatik olarak benzersiz |
| Sıralama | Sıralıdır | Genel amaçlı sıralama yok (anahtar-değer yapısı) | Sırasız |
Genel olarak: sık sık anahtar bazlı arama veya membership testi yapacaksanız dict veya set tercih edin; öğelerin sırası ve indeksle erişim gerekiyorsa list daha uygundur (kaynak).
Pratik örnekler ve senaryolar
1) Bir listeden hızlıca tekrar edenleri kaldırmak
Tekrarları kaldırmak için set kullanabilirsiniz. Ancak set sırasız olduğu için orijinal sıralamayı korumanız gerekiyorsa farklı bir yaklaşım gerekir.
Basit (sıralama fark etmez):
items = [3,1,2,3,2]
unique = list(set(items)) # örn. [1,2,3] (sıralama garantisi yok)
Sıralamayı koruyarak:
seen = set()
result = []
for x in items:
if x not in seen:
seen.add(x)
result.append(x)
# result = [3,1,2]
2) Sıklık sayımı (frequency counting)
Sıklık sayımı için dict veya collections.Counter kullanabilirsiniz. Counter, hazır fonksiyonlar sunar ve daha okunaklıdır (bkz. collections).
Örnek (dict):
counts = {}
for x in items:
counts[x] = counts.get(x, 0) + 1
Örnek (Counter):
from collections import Counter
c = Counter(items)
3) Hızlı lookup tablosu / cache
Eğer bir öğeyi sıkça sorguluyor ve doğrudan bir değere erişmek istiyorsanız dict kullanın. Örneğin bir kullanıcı kimliğinden kullanıcı bilgisi almak gibi.
Örnek:
users = {'alice': {...}, 'bob': {...}}
user = users.get(username)
4) Etiketleme, tag kümeleri ve küme işlemleri
Bir öğeye ait etiketler üzerinde kesişim, birleşim gibi işlemler yapmak için set uygundur.
Örnek:
tags_a = {'python','web','backend'}
tags_b = {'python','data'}
common = tags_a & tags_b # {'python'}
En iyi uygulamalar ve dikkat edilmesi gerekenler
- Boş set oluşturma: Boş set için set() kullanın; {} boş dict oluşturur (kaynak: Python Tutorial).
- Hashable anahtarlar: Dict anahtarları ve set öğeleri hashable olmalıdır: int, str, tuple (içindeki öğeler de hashable olmalı) gibi. Mutable türleri anahtar olarak kullanmayın.
- İterasyon sırasında değiştirme: Bir koleksiyonu iterasyon yaparken değiştirmek beklenmeyen sonuçlara yol açabilir; gerekiyorsa kopya üzerinde çalışın (örnek: for k in list(d.keys()): ...).
- collections modülü: Kuyruk/çift uçlu kuyruk işlemleri için collections.deque gibi yapıların daha uygun olduğu durumlar vardır (bkz. collections).
- Okunabilirlik: Küçük optimizasyonlardan önce kodun okunabilirliğini ve bakımını ön planda tutun; veri yapısını doğru seçmek çoğu performans sorununu çözer.
Hızlı karar ağacı
- Sıra önemli mi? → Evet: list; Hayır: dict/set düşünülebilir.
- Her öğe benzersiz olmalı mı? → Evet: set veya dict anahtarı.
- Sık membership (in) kontrolleri mi yapılıyor? → Evet: set veya dict.
- Anahtar-değer eşlemesi gerekiyor mu? → Evet: dict.
Kaynaklar ve ileri okuma
Bu makaledeki temel tanımlar ve öneriler Python resmi belgelerine dayanmaktadır:
- 5. Veri Yapıları — Python 3.9 Tutorial (list, dict, set açıklamaları).
- collections — Container datatypes — Python 3.9 Library (Counter, deque vb. için referans).
- 5. Veri Yapıları — Python Türkçe Belgeleri (3.15) (Türkçe referans).
Sonuç olarak, hangi veri yapısını seçeceğiniz uygulamanızın ihtiyaçlarına bağlıdır: sıralama, tekrar izin durumu, sık membership testleri veya anahtar-değer erişimi gibi kriterleri göz önüne alarak list, dict veya set seçin.