Python Set (Küme) Kullanımı: Tekrarları Silme, Birleşim ve Kesişim
Beceri rehberi

Python Set (Küme) Kullanımı: Tekrarları Silme, Birleşim ve Kesişim

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 6 dk okuma

Set, sırasız ve tekrarsız öğeler tutan veri tipidir. Rehber tekrarları silmeyi, birleşim, kesişim ve fark işlemlerini, üyelik testini, hashable kuralını ve sık hataları örneklerle anlatır.

Bir bakışta

  1. Set sırasız ve tekrarsızdır. Tekrarlı öğeleri otomatik eler; indeksle erişim yoktur.
  2. Boş set için set() yazılır. Boş süslü parantez boş sözlük oluşturur.
  3. Dört operatör kümeyle çalışır. | birleşim, & kesişim, - fark, ^ simetrik fark.
  4. Öğeler değiştirilemez olmalıdır. Sayı, metin ve demet girer; liste ve sözlük girmez.
  5. Sırayı korumak gerekiyorsa set tek başına yetmez. dict.fromkeys kalıbı tekrarları silerken sırayı korur.

Set nedir ve neden liste değildir

Set (küme), Python'un sırasız ve tekrarsız öğeler tutan veri tipidir. Python belgelerinin tarifiyle sırasız bir koleksiyondur ve yinelenen öğe içermez. İki özellik hemen sonuç verir: bir listedeki tekrarları temizlemek ve bir değerin koleksiyonda olup olmadığını hızlıca sınamak.

Küme matematiksel kümeden gelir; dolayısıyla birleşim, kesişim ve fark gibi işlemler yerleşik olarak sunulur. İki müşteri listesini karşılaştırıp ortak olanları bulmak, bir listede olup diğerinde olmayanları ayıklamak gibi işler listelerle çok adım ister, kümelerle tek ifadedir.

Küme oluşturmanın iki yolu vardır: süslü parantez ya da set işlevi. Burada bir tuzak var: boş küme oluşturmak için set() yazmanız gerekir, çünkü boş süslü parantez boş sözlük üretir. Belgeler bu noktayı özellikle uyarı olarak belirtir.

musteriler = {'Ayşe', 'Mehmet', 'Elif', 'Ayşe'} bos_kume = set() benzersiz = set(tekrarli_liste)

İlk satırdaki tekrar eden isim otomatik olarak elenir. Üçüncü satır, bir listedeki tekrarları temizlemenin en kısa yoludur.

Birleşim, kesişim, fark: set işlemleri

Python belgeleri küme işlemlerini iki harf kümesi üzerinden gösterir ve dört operatör tanıtır: | birleşim, & kesişim, - fark, ^ simetrik fark.

Birleşim a | b, iki kümeden en az birinde olan öğeleri verir. Kesişim a & b, ikisinde birden bulunanları. Fark a - b, a'da olup b'de olmayanları. Simetrik fark a ^ b, ikisinden yalnızca birinde olanları, yani ortak olmayanları verir.

ortak = a & b sadece_a = a - b herhangi = a | b ortak_degil = a ^ b

Bunları iş senaryolarıyla düşünün. Bu ay ve geçen ay alışveriş yapan müşterilerin kümeleri varsa kesişim sadık müşterileri, "geçen ay var, bu ay yok" farkı kaybedilenleri, birleşim iki dönemde de aktif olan herkesi, simetrik fark ise yalnızca birinde görünenleri verir. Bu çözüm, listelerde elle karşılaştırma döngüsü yazmaktan çok daha kısadır. Aynı mantık veritabanında iki tablo arasındaki farkı bulmak için de kullanılır.

Operatörlerin yanı sıra union, intersection, difference gibi yöntemler de vardır; bunlar yalnızca küme değil, herhangi bir iterable de kabul eder. Operatörler her iki tarafın da küme olmasını bekler.

Şekil 1

Dört küme işlemi, iki kümenin dört bölgesinden gelir

Her bölge hangi işlemin sonucuna girer

A'da yokA'da var
Sadece AA - B ve A ^ B sonucuna girer
OrtakA & B sonucuna girer; birleşimde de bulunur
Hiçbirinde yokHiçbir işlemin sonucunda yer almaz
Sadece BB - A ve A ^ B sonucuna girer
B'de yokB'de var
Kaynak: Python belgeleri: Data Structures (Sets)Mindset Institute

Ekleme, çıkarma ve üyelik testi

Küme değiştirilebilir bir yapıdır: add yöntemiyle öğe eklenir, remove ve discard ile çıkarılır. İkisinin farkı önemlidir: remove, olmayan bir öğeyi çıkarmaya çalışırsa hata verir; discard ise sessizce geçer. Bilinmeyen verilerde discard daha güvenlidir.

yetkili = {'okuma', 'yazma'} yetkili.add('silme') yetkili.discard('yönetim') if 'yazma' in yetkili: islem_yap()

Üyelik testi, kümelerin en güçlü yanıdır. Belgeler üyelik testini hızlı olarak niteler; küme öğeleri arama yapısıyla tutulduğundan, büyük koleksiyonlarda in kontrolü listeden belirgin biçimde çabuk olabilir. Büyük bir yasaklı kelime listesi ya da tanınmış kimlikler üzerinde tekrar tekrar "var mı" sorusu soruyorsanız, listeyi bir kez kümeye çevirmek anlamlı bir iyileştirmedir.

Sırasız olmak, kümenin sıra bilgisi taşımamasıdır. Belgeler, kümeyi dolaşırken ya da yazdırırken öğelerin beklediğinizden farklı sırada gelebileceğini söyler. Dolayısıyla "ilk öğe", "üçüncü öğe" gibi indekslerle erişim yoktur; sıralı sonuç gerekiyorsa sorted ile geçici bir liste elde edilir.

Küme üreteci de vardır: liste üretecine benzer şekilde süslü parantez içinde yazılır ve sonuç tekrarsızdır.

Kümeye girebilen öğeler: hashable kuralı

Kümenin her öğesi "hash'lenebilir" olmalıdır; kabaca bu, öğenin değiştirilemez olması anlamına gelir. Sayılar, metinler ve demetler küme öğesi olabilir; listeler, sözlükler ve diğer kümeler olamaz. Bir kümeye listeyi eklemeye çalışırsanız TypeError alırsınız.

Bu kural sıkça hata kaynağıdır. Örneğin iç içe liste içeren bir veride tekrarları kümeyle ayıklamak istediğinizde her satırı önce demete çevirmek gerekir: set(tuple(satir) for satir in kayitlar). Böylece değiştirilemez demetler kümeye girebilir. Tersine, ayıklama sonrası tekrar listeye ihtiyaç varsa list ile çevirirsiniz.

Aynı sebeple küme içindeki bir kümeyi tutmak için frozenset adlı değiştirilemez küme türü kullanılır. Günlük işlerde nadir gerekir, ama kümelerden oluşan bir kümeye ihtiyaç duyduğunuzda bilinmesi gereken araçtır.

Sözlük ile karşılaştırınca küme, yalnızca anahtarları olan bir sözlük gibidir; değerler yoktur, yalnızca "bu öğe var" bilgisi vardır. Hangi öğenin kaç kez geçtiğini sayacaksanız küme değil sözlük ya da sayaç yapısı gerekir; küme tekrarı siler, saymaz.

Küme ne zaman, liste ya da sözlük ne zaman

Küme her durumda en iyi seçim değildir. Karar basit sorularla verilir:

  • Tekrarlar anlamlı mı? Her öğenin kaç kez geçtiği önemliyse liste ya da sayaç. Yalnızca "var mı yok mu" önemliyse küme.
  • Sıra önemli mi? Sıra korunacaksa liste. Küme sırayı korumaz.
  • Öğeler değiştirilemez mi? Liste ya da sözlük öğeleri küme içine giremez.
  • Sık sık "bu öğe koleksiyonda mı" sorusu soruluyor mu? Küme.
  • Ortak ve farklı öğeler mi aranıyor? Küme işlemleri.
  • Her öğeye bağlı bir değer var mı? Sözlük.

Tekrarları silerken sırayı da korumak istiyorsanız, yalnızca set() yazmak yeterli olmaz; dict.fromkeys(liste) kalıbı sırayı koruyarak tekrarları eler ve list ile listeye döner. Bu kalıp sözlük anahtarlarının tekrarsız olduğu özelliğine dayanır.

Veri analizinde küme işlemleri veri temizlemenin sessiz yardımcısıdır: iki veri kaynağındaki farklı kimlikleri bulmak, bir listedeki geçersiz kayıtları dışlamak ya da iki raporun uyuşmayan satırlarını yakalamak gibi. Bu işlerde önce veriyi kümeye çevirip işlem yapmak, döngü yazmaktan çok daha az kodla sonuç verir.

Sık yapılan hatalar

Kümelerde tekrar eden hatalar şunlardır:

  • Boş küme için {} yazmak: bu boş sözlüktür, boş küme için set() gerekir.
  • Küme içinde sıra beklemek: kümede indeks ve sabit sıra yoktur; ilk öğe diye bir kavram bulunmaz.
  • Listeyi kümeye çevirip tekrar listeye döndüğünde sırayı kaybetmek: sıra gerekiyorsa dict.fromkeys kalıbını kullanın.
  • Değiştirilebilir öğeyi kümeye eklemeye çalışmak: liste ve sözlük hash'lenemez, TypeError alırsınız.
  • remove ile olmayan öğeyi çıkarmak: hata verir, güvenli yol discard'dır.
  • Kümeyi sayaç sanmak: tekrarlar silinir, sayılmaz.
  • Operatörü karşılaştırma ile karıştırmak: - fark, & kesişimdir; sayı mantığındaki çıkarma ve bit işlemiyle karıştırmayın.
  • Küçük veride gereksiz karmaşıklık yaratmak: birkaç öğelik bir listede küme dönüşümü kazanç sağlamaz, okunurluğu azaltır.

İyi bir alışkanlık: kümeyi, sorunun yapısı gerçekten "benzersiz öğeler ve ortaklık" olduğunda seçin. Kodunuzu okuyan biri set gördüğünde bu niyeti anlamalıdır.

Bu beceriyi Mindset programlarında nerede çalışırsınız

Data Science Bootcamp ve Python ile Programlama Eğitimi, Veri Yapıları başlıklı modüllerde liste, sözlük ve kümeyi birlikte ele alır. Kümeler, veri temizleyen ve iki kaynağı karşılaştıran analist için özellikle işe yarar: tekrarlı kayıtları ayıklamak, ortak kimlikleri bulmak ve eksik kayıtları saptamak gibi sık işler birkaç satırda çözülür.

İlgili Mindset programı

Python ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

Python'da set ile liste arasındaki fark nedir?

Liste sıralıdır, tekrarlı öğe tutabilir ve indeksle erişilir. Set sırasızdır, tekrarlı öğe tutmaz ve indeksi yoktur; karşılığında üyelik testi ve küme işlemleri sunar. Tekrarları temizlemek ve ortak ya da farklı öğeleri bulmak için set, sıra ve tekrar önemliyse liste uygundur.

Boş set nasıl oluşturulur?

set() yazarak. Python belgeleri, boş küme için set() kullanılması gerektiğini, boş süslü parantezlerin ise boş sözlük oluşturduğunu özellikle uyarır. Boş olmayan kümeyi ise süslü parantezle doğrudan yazabilirsiniz; ayrım yalnızca öğe yazmadığınız durumda ortaya çıkar.

Liste kümeye eklenebilir mi?

Hayır, çünkü liste değiştirilebilir ve hash'lenemez; eklemeye çalışırsanız TypeError alırsınız. Listeyi önce demete çevirerek ekleyebilirsiniz. Küme öğeleri sayı, metin ve demet gibi değiştirilemez türler olmalıdır; iç içe küme için frozenset kullanılır.

Küme tekrarları temizlerken sırayı korur mu?

Hayır, küme sırasızdır; listeyi set'e çevirip geri dönerseniz sıra bozulabilir. Sırayı korumanız gerekiyorsa dict.fromkeys(liste) kalıbıyla tekrarları eleyip list ile listeye dönün ya da bir döngüde görülenleri küme ile izleyerek yeni liste kurun.

remove ile discard arasındaki fark nedir?

İkisi de bir öğeyi kümeden çıkarır. remove, öğe yoksa hata verir; discard ise öğe yoksa sessizce hiçbir şey yapmaz. Öğenin varlığından emin değilseniz discard daha güvenlidir, yokluğun bir sorun olduğunu bilmek istiyorsanız remove yol gösterir.

Python Set (Küme): Tekrarları Silme ve Küme İşlemleri