Python list, dict ve set kullanımı: örnekler ve performans

Python Veri Yapıları

Python list, dict ve set kullanımı: örnekler ve performans

Python Veri Yapıları
5 dk okuma süresi
Bu rehberde Python'un üç temel veri yapısı — list, dict ve set — nasıl kullanılır, ne zaman tercih edilir ve performans açısından hangi durumlar için uygun olduklarını örneklerle açıklıyorum.
Python list, dict ve set kullanımı: örnekler ve performans

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ı

  1. Sıra önemli mi? → Evet: list; Hayır: dict/set düşünülebilir.
  2. Her öğe benzersiz olmalı mı? → Evet: set veya dict anahtarı.
  3. Sık membership (in) kontrolleri mi yapılıyor? → Evet: set veya dict.
  4. 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:

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.