Python Programlama Dili

Bölüm 2

Genel Yöntemler

Top Navigasyon

Ders 23

3.4 - Kümeler (Sets)

Python Programlama dili, iki türlü küme nesnesini destekler. Bunlardan ilki, değişebilir bir tip olan set (küme) diğeri de değişmez (immutable) bir tip olan frozenset (donmuş küme) veri tipleridir. Bu iki tipin değişme (mutability) özelliği dışında oluşturulmaları ve elemanlarına erişim yöntemleri aynıdır. Tek farkettikleri alan, uygulanabilecek öntanımlı metotların değişme yeteneğine göre seçilmesidir.

Öntanımlı bir küme veri tipi, Python programlama dilinin matemetikçilere armağanı sayılabilir. Çok az sayıda bilgisayar dili, kümeleri öntanımlı olarak desteklemektedir.

Küme elemanları, tanım gereği sıralı değillerdir. Kümelerin elemanlarına iteratif yöntemlerle gelişigüzel olarak erişilebilir. Küme elemanları, tüm diğer koleksiyon tiplerinde olduğu gibi, in aidiyet testlerini ve len() uzunluk saptamasını desteklerler.

Küme elemanları, sadece hash edilebilen nesneleri elaman olarak içerebilir. Bunun sonucunda sadece int, float, string ve topluluk tipinde veriler küme elemanları olabilirler. Fakat, liste, sözlük ve bizatihi küme tipleri küme elamanı olamazlar.

3.4.1 - Küme Oluşumu

Kümelerin oluşturulması diğer koleksiyon tiplerinden farksızdır. Eleman içeren bir kümenin literal olarak oluşturulması için, süslü parantezlerin arasına virgülle ayrılmış elemanların yazılması yeterlidir.

şeklinde olur. Görüldüğü gibi, oluşan küme sadece bir tek 3 içermektedir. Literal olarak bir kümeye iki tane yanı değerde eleman yerleştirmek istesek de Python derleyicisi bu isteği kabul etmeyerek, kümenin, kuramın öngördüğü gibi, her eşit değerden sadece bir tek eleman içerecek şekilde oluşturmuştur.

Kümeler, öntanımlı küme oluşturucu fonksiyon set() kullanımı ile de oluşturulabilirler. Bu fonksiyon tek bir hash edilebilecek elemanı argüman olarak kabul eder. Örnek,

Veya, listenin ayrı olarak belirtilmesine de olanak bulunmaktadır. Örnek,

Program çıktıları incelendiğinde, eleman sıralarının gözetilmediği görülecektir.

Sadece hash edilebilen topluluklar bir kümenin elemanı olabilirler. Bunlar, içeriklerinde hiç değişebilen tipte eleman içermeyen topluluklardır. Örnek olarak, aşağıda görülen tipte bir topluluk, bir kümenin elemanı olamaz.

Boş bir küme, ∅ olarak gösterilir. Boş küme, literal olarak, boş {} olarak yaratılamaz. Boş kümenin mutlaka argümansız set() fonksiyonu kullanılarak, d = set() şeklinde yaratılması gerekir. Bu şekilde d ye ∅ atanmış olur.

Kümeler, diğer koleksiyon tipleri gibi set comprehension yöntemi ile de oluşturulabilirler. Örnek,

Küme içerikleri (set comprehension) belirli bir koşulu sağlayabilecek elemanları da seçebilir. Örnek,

Tekrar hatırlayalım. Bu ifadede, ilk i, oluşacak kümenin bir elamanını, for i in <uygun iteratör> daki i ise, taranan iteratördeki bir elemanı belirtmektedir. İfadenin değerlendirilmesi sağdan başlar ve ilk olarak ikinci i tanımlanmaya çalışılır. İkinci i tanımlanmış olduğunda, küme elemanı olan i de tanımlanmmış olur ve küme oluşturulabilirse oluşturulur. Örnek olarak yukarıdaki ifade, küme4 = set( j for i in liste4) olarak belirtilirse, Python derleyicisi bu ifadeyi kabul etmez ve J nin tanımlı olmadığı yanıtını verir.

3.4.2 - Küme Elemanlarına Erişim

Kümeler, koleksiyon ailesi içinde olan bir veri türüdür. Buna rağmen, küme tipi verilerin elemanları kuramsal olarak sıralı değillerdir ve buna uygun olarak Python derleyicisi, küme elemanlarına indis değeri vermez. Bu durumda, küme elemanlarının elemanlarına sıralı erişim, sadece o andaki sıralama için geçerlidir ve görüntülendiğinde de sonuçlar o anda geçerli olan sıralamayı bile yansıtmaz, Python derleyicisi, görüntülemeden önce, görüntülenecek sonuçta, eleman sırasını karıştırır ve karıştırılmış sonucu görüntüler. Örnek olarak,

şeklinde erişim standarttır. Alınan görüntü, küme elemanlarına erişim sonucunun, eleman sırası karıştırılarak kullanıcıya yansıtılmasıdır. Doğal olarak kümenin eleman sayısı artar veya eksilirse, görüntülenen karıştırılmış eleman indisleri de değişecektir.

Küme elemanlarının anlık sıralamasını enumerate() fonksiyonunu uygulayarak alabiliriz. Fakat, enumerate () fonksiyonu da sadece küme elemanlarının o anki kompozisyonuna göre karıştırılmış sonuçları verir. Kümenin eleman sayısı artar veya eksilirse, eleman indisleri de değişecektir. Örnek:

Küme elemanlarının yerleşim sıralarının belli olması ve elemanlara değişmeyen sıra numaraları ile erişim amaçlanıyorsa, frozenset veri tipi ile çalışılmalıdır.

3.4.3 - Kümelere Uygulanabilecek Metotlar

Küme veri sınıfı, matematikte tanımmlı ve işlem kuralları belli olan bir veri tipidir. Bu nedenle, Python programlama dilinde tanımlı tüm küme işlemlerinin yapılabilmesini sağlayacak öntanımlı fonksiyonlar sağlanmıştır.

Kümelere eleman eklenmesi, add() fonksiyonundan yararlanılarak yapılabilir. Bufonksiyon eklenmesi istenen elemanı inceler ve bu eleman zaten kümenin bir elemanı ise, ekleme isteğini geri çevirir. Örnek : (Eğer eklenecek elaman kümenin bir elemanı ile aynı ise)

Eğer eklenecek eleman daha önce kümede bulunuyorsa,

Görüldüğü gibi, hiçbir uyarı veya kabul etmeme mesajı yok. Elemanın eklenip eklemedğini bilmiyoruz. Kümenin yapısı değişmemiş gibi duruyor.

Küme lemenlarından birini kümeden çıkarmak için, discard() fonksiyonu kullanılır. Örnek:

Yukarıdaki örnekte görüldüğü gibi, discard() foksiyonu, çıkartılmak istenen eleman kümede bulunmuyorsa, hiçbir işlem yapmaz ve hiçbir mesaj vermez. Oysaki remove() fonksiyonu, aşağıdaki örnekte görüldüğü gibi, eğer eleman kümede yoksa bir hata mesajı verir.

Bir kümedeki tüm elemanların kaldırılması için, aşağıdaki örnekte görüldüğü gibi, clear() metodu çağrılır.

Program sonucundan da görüldüü gibi, clear() metodu uygulandığında, VT kümesi, boş küme ∅ ye eşit olmaktadır.

Bir kümenin, sığ kopyalanması için, copy() metodu çağrılabilir.

Tanımlı A ve B kümelerinin farkı, A-B ifadesi ile gerçekleştirilebilir. Bu ifade hem A hem de B kümesinde bulunan her elemanı, A kümesinden çıkartarak, yeni bir kümeyi sonuç olarak geri dönürür.

Aynı sonuç, difference() metodu çağrılarak da alınır. Örnek,

A ve B kümelerinin farkı, A-=B ifadesi ile gerçekleştirilebilir. Bu işlem sonucunda, hem A hem de B kümesinde bulunan her eleman, A kümesinden çıkartılarak A kümesinin içeriği güncellenmiş olur. Örnek:

Aynı sonuç, difference_update() metodu çağrılarak da alınır. Fakat dikkat, önce güncelleştirmek sonra görüntülemek gerekir. Örnek,

Eğer, print(A.difference_update(B)) dersek, geriye None döner, çünkü, tüm update metotlerı veriyi güncelleştirir ve geriye None döndürür fakat hiçbir zaman bu fonksiyonların geri döndürdükleri değer kullanılmaz. Bu fonksiyonlar güncellemelerini yaptıktan sonra, güncellenen nesne ile işlem yapılır. Aynen, yukarıdaki program da olduğu gibi, küme nesnesi önce güncelleniyor, sonra da güncellenen değeri görüntüleniyor. Eğer A = A.difference_update(B) sonra da print(A) denilirse yine None yanıtı alınır. Çünkü, A kümesinin değeri None olarak güncellenmiş olur ve bu da hiç istenmeyen bir şeydir.

A ve B kümelerinin kesişmeleri A & B , A.intersection(B) ve A.intersection_update(B) metotları ile incelenir. Dikkatli kullanılırsa her üçü de aynı sonucu verir.

A kümesinin güncellenmemiş oduğu görülüyor.

A kümesinin güncellenmemiş oduğu görülüyor.

A kümesinin güncellenmiş oduğu görülüyor. Diğer metotlar A kümesini olduğu gibi bırakıyor sadece sonucu sanal ortamda oluşturup görüntülüyor. Bir tek A.intersection update(B) metodu A kümesini güncelliyor.

A ve B kümelerinin ayrık kümeler olup olmadıkları, isdisjoint() metodu çağrılarak saptanabilir.

A ve B kümelerinin ortak elemanları olduğu böylece belirlenmiş olmaktadır.

A ve B kümelerinin birbirlerinin alt kümeleri olduğu, simgesel olarak, A >= B ve fonksiyon olarak A.issubset(B) ifadeleri ile sınanabilir. Bu fonksiyon, eğer A kümesi B ye eşit veya A kümesi B kümesinin bir alt kümesi ise True aksi halde False sonucunu verir.

Bir A kümesinin bir B kümesinin özalt kümesi olup olmadığı s < t karşılaştırılması yapılarak saptanabilir. Örnek,

Bir A kümesinin, bir B kümesinin üst kümesi olup olmadığı, simgesel olarak A > = B ifadesi ile, fonksiyonel olarak da A.issuperset(B) şekli,nde sınanabilir. Örnek,

Bir A kümesinin, bir B kümesinin özüst kümesi olup olmadığı, simgesel olarak A > B ifadesi ile sınanır. Örnek,

Bir A kümesinin, bir B kümesi ile simetrik farkı, simgesel olarak, A ^ B ifadesi ile, fonksiyonel olarak da A.symmetric_difference(B) ifadesi ile sınanabilir. Bu ifade uygulandığında, elemanları ayrı ayrı A ve B kümelerinde bulunan, fakat her iki kümede birden bulunan elemanlar dışındaki elemanları içeren yeni bir küme oluşturulur. Örnek,

Abir A kümesinin içeriğinin, bir B kümesi ile simetrik fark sonucu ile güncellenmesi, simgesel olarak A ^= B veya fonksiyonel olarak, A.symmetric_difference_update(B) şeklinde gerçekleştirilebilir. Örnek,

Bir A kümesi ile bie B kümesinin birleşimi, A daki tüm elamanları ve B deki, A da bulunmayan elemanları içeren yeni bir kümedir. Bu küme , simgesel olarak A | B ve fonksiyonel olarak da, A.union(B) şeklinde oluşturulur. Örnek,

Bir A kümesinin bir B kümesinin içeriği ile güncellenmesi, A nın elemanlarına A olan tüm elamanların ve B de olan fakat A da olmayan elemanların eklenerek genişletilmesidir. Bu olay simgesel olarak A |= B veya fonksiyonel olarak, A.update(B) şeklinde gerçekleştirilir. Örnek: