[Bölüm 14] Python Dilinde Küme (Set) Veri Yapıları

Merhaba arkadaşlar, bugün bu yazımda Python programlama dilindeki bir diğer önemli veri yapısı olan küme veri yapılarından bahsedeceğim.

Öncelikle belirtmek isterim ki Python’da kümeleri liste ve demetlerden farklı olarak süslü parantezleri kullanarak tanımlayacağız ve tanımladığımız kümenin elemanlarını iki süslü parantez arasına yerleştireceğiz.

Örnek:

kume = {1,2,3,4,5,6,7,8,9}
print(kume)

Çıktı:

{1, 2, 3, 4, 5, 6, 7, 8, 9}

Python dilinde küme veri yapıları diğer veri yapılarında olduğu gibi sıralama indexleriyle ifade edilmezler. Yani kümelerin içerisindeki elemanlar sırasız elemanlardır. 0. , 1. , 2. eleman demek yanlış olur ve program hata verir.

Örnek:

kume = {1,2,3,4,5,6,7,8,9} #bir küme tanımladım
print(kume[1]) #kümemin elemanlarından birini yazdırmaya çalıştım

Çıktı:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in ()
      1 kume = {1,2,3,4,5,6,7,8,9}
----> 2 print(kume[1])

TypeError: 'set' object does not support indexing

Yine aynı şekilde Python dilindeki kümeleri matematikteki kümelerle bağdaştırmanın şu an tam da yeri. Matematikte olduğu gibi kümelerdeki elemanlar tekil elemanlardır yani aynı eleman aynı küme içerisinde birden fazla bulunamaz. Hemen aşağıda bunun bir örneğini yazdım. Bir küme tanımladım ve içerisine bazı elemanlardan birden fazla yazdım. Python ise küme içerisindeki bu elemanları tekil olarak kabul etti. Yani Pythonda kümelerin elemanları tekildir (unique) demek daha doğru olur.

Örnek:

kume = {1,2,2,2,2,3,4,5,6,7,7,7,7,8,9} # aynı elemanı birden fazla yazarak küme içine aldım
print(kume) #kümeyi ekrana yazdırdım

'''aldığımız çıktıdaki elemanlara bakalım amacımız bir elemanın kaç defa ekrana yazdırıldığını görmek'''

Çıktı:

{1, 2, 3, 4, 5, 6, 7, 8, 9}

Python programlama dilinde kümeler içerisinde değiştirebilir (mutable) eleman barındırmazlar. Yani örneklemek gerekirse bir kümenin içerisinde bir liste barındıramazsınız. Hemen aşağıda bu durumu örnek kodlarla gösterdim.

Örnek:

a = {1,2,3,4,5} #5 elemanlı sayılardan oluşan bir küme tanımladım
b = {1,2,'elektrik','tesisleri','kulübü',3,4} #hem sayı hem de stringlerden oluşan bir küme tanımladım
print('a kümesinin eleman sayısı = {}\n'
      'b kümesinin eleman sayısı = {}\n'
      'a ve b kümelerinin eleman sayıları toplamı = {}'.format(len(a),len(b),len(a)+len(b)) )
#len fonksiyonu ile kümelerin eleman sayısını hesapladım

Çıktı:

a kümesinin eleman sayısı = 5
b kümesinin eleman sayısı = 7
a ve b kümelerinin eleman sayıları toplamı = 12

Örnek:

c = {1,2,3,[4,5,6,7,8,9]} #kümenin içerisine liste yerleştirdim
#Python bu kümeyi kabul etmeyerek hata mesajı döndürecektir
print(c)

Çıktı:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-efffc4c9ca48> in <module>()
----> 1 c = {1,2,3,[4,5,6,7,8,9]} #kümenin içerisine liste yerleştirdim
      2 #Python bu kümeyi kabul etmeyerek hata mesajı döndürecektir
      3 print(c)

TypeError: unhashable type: 'list'

Python kümelerin içerisinde uygulanması için matematiksel set işlemlerini destekler. set fonksiyonu ile bir kümenin içerisindeki tekrarlanan elemanları silebilir ve kümenin tüm elemanlarının tekil olmasını sağlayabiliriz. set fonksiyonu tekrarlana elemanları siler ve sıralar. Eğer string veri tipi mevcut ise stringi parçalayarak işleme alır.

Örnek:

d = {1,2,3,3,3,3,34,4,4}
set(d)
print(d)

e = "elektrikvadisinet"
f = "elektrik tesisleri kulübü"
print('{}\n{}'.format(set(e),set(f)))

Çıktı:

{1, 2, 3, 34, 4}
{'l', 'v', 'a', 'k', 'i', 'd', 's', 'n', 'e', 'r', 't'}
{'l', ' ', 'u', 'k', 'i', 's', 'b', 'ü', 'e', 'r', 't'}

set fonksiyonunu listeler ve demetler üzerinde de uygulayabiliriz lakin çıktı olarak Python bir küme döndürecektir. Hemen aşağıda örnek bir kod ile açıkladım.

g = ['a','a','a','b','c','d','d','e']
print(set(g)) #listedeki elemanları set yaparak ekrana yazdırdım

h = 1,2,3,3,3,3,4,4,4,5,5,5,6,6,7,7,7,7,7
print(set(h)) #demetteki elemanları set yaparak ekrana yazdırdım

Çıktı:

{'c', 'a', 'd', 'b', 'e'}
{1, 2, 3, 4, 5, 6, 7}

Kümelerde Eleman Kontrolü Nasıl Yapılır?

Daha öncede liste ve demetlerde de bu tarz kontroller yapmıştık. Şimdi aşağıya yazdığım örnek kodlar kümeler üzerindeki eleman kontrollerine birer örnektir. Liste ve demetlerden çok da bir farkı olmasa gerek. 🙂

Örnek:

etk = {1,2,3,4,5,6,7,8,9}
print(1 in etk)
print(2 in etk)
print(3 in etk)
print(4 in etk)
print(5 in etk)
print(10 in etk)

Çıktı:

True
True
True
True
True
False

Matematikte kullanılan kesişim birleşim gibi küme işlemleri yine aynı şekil Python üzerinde de kullanılır.

Örnek:

besler = {5,10,15,20,25,30,35,40}
onlar = {10,20,30,40,50}

print('kümeler = ',besler,onlar) #iki kümeyide ekrana yazdırdım
print('birleşim = ',besler | onlar) #iki kümenin birleşimini ekrana yazdırdım
print('fark = ',besler - onlar) #iki kümenin farkını ekrana yazdırdım (beşler - onlar)
print('kesişim = ',besler & onlar) #iki kümenin kesişimini ekrana yazdırdım
print('simetrik fark = ',besler ^ onlar) #birleşim - kesişimi ekrana yazdırdım (simetrik fark)

Çıktı:

kümeler =  {35, 5, 40, 10, 15, 20, 25, 30} {40, 10, 50, 20, 30}
birleşim =  {35, 5, 40, 10, 15, 50, 20, 25, 30}
fark =  {25, 35, 5, 15}
kesişim =  {40, 10, 20, 30}
simetrik fark =  {35, 5, 15, 50, 25}

Şimdi aşağıda bir demetin elemanlarının bir kümenin elemanlarına toplu atanmasını göstereceğim. Oldukça kısa ve basit 🙂

Örnek:

sayma_sayilari = {1,2,3,4,5,6,7,8,9} #küme tanımladım
a,b,c,d,e,f,g,h,i = sayma_sayilari #demet tanımlayarak kümeye toplu atadım
for i in a,b,c,d,e,f,g,h,i: #döngü ile demetin değerlerini yazdırdım
    print(i)

Çıktı:

1
2
3
4
5
6
7
8
9

Python Küme Metodları

Metod İşlev
k.add(x) k kümesine değiştirilemez x elemanını ekler
k.clear k kümesinin tüm elemanlarını siler
k.copy k kümesini kopyalar
k.difference(a) k kümesinin a kümesinden farkını bulur (k-a)
k.discard(x) x elemanı k kümesinde ise siler yoksa bir şey yapmaz
k.removed(x) x elemanı k kümesinde ise siler yoksa hata mesajı döndürür
k.intersection(x) k kümesi ile x kümesinin kesişimini çıktı verir (k&x)
k.isdisjoint(x) k ve x kümelerinin kesişimlerinin boş (null) olup olmadığını kontrol eder
k.issubset(x) k kümesinin x kümesinin alt kümesi olup olmadığını kontrol eder
k.issuperset(x) k kümesinin x kümesini tamamen kapsayıp kapsamadığını kontrol eder
k.pop() k kümesinden rastgele bir eleman döndürür ve kümeden siler. Küme boş ise hata verir.
frozenset(x) x kümesini donuk kümeye dönüştürür. x kümesinin elemanlarının da değiştirilemez olmasını sağlar.

Hemen aşağıda yukarıdaki tabloda yazmış olduğum küme metodlarını pekiştirmek için örneklerle açıkladım, inceleyelim.

add() metodu

a = {1,2,3,4,5,6,7,8,9}
a.add(0) #a kümesine 0 elemanını ekledim
print(a)

Çıktı:

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

clear() metodu

b = {'a','b','c','d','e'}
print(b)
b.clear() #b kümesinin tüm elemanlarını sildim
print(b)

Çıktı:

{'e', 'b', 'a', 'c', 'd'}
set()

copy() metodu

c = {3,6,9,12,15}
print(c)
d = c.copy() #kümemizi kopyaladım
print(d)

Çıktı:

{3, 6, 9, 12, 15}
{3, 6, 9, 12, 15}

difference() metodu

e = {1,2,3,4,5}
f = {3,4,5,6,7}
print(e.difference(f)) #e-f işlemini yaptım

Çıktı:

{1, 2}

discard() ve remove() metodu

g = {1,3,5,7,9,11,13,15}
g.discard(11) #11 elemanını kümeden sildim
print(g)

g.remove(17) #17 elemanı olmadığı için hata verecek

Çıktı:

{1, 3, 5, 7, 9, 13, 15}
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-25-371a66554ee0> in <module>()
      3 print(g)
      4 
----> 5 g.remove(17)

KeyError: 17

intersection() ve isdisjoint() metodu

a = {1,2,3,4,5,6,7,8,9}
c = {3,6,9,12,15}
print(a.intersection(c)) #kesişimi kontrol edip ekrana yazdırdım
print(a.isdisjoint(c)) #kesişimin boş olup olmadığını kontrol ettim

Çıktı:

{9, 3, 6}
False

issubset()  ve issuperset() metodu

ı = {2,4,6}
h = {1,2,3,4,5,6,7}
print(ı.issubset(h)) #ı kümesinin h kümesinin alt kümesi olup olmadığını kontrol ettim 
print(h.issuperset(ı)) #h kümesinin ı kümesini tamamen kapsayıp kapsamadığını kontrol ettim

Çıktı:

True
True

pop() metodu

a = {1,2,3,4,5,6,7,8,9}
a.pop() #rastgele bir eleman sildim
print(a)

Çıktı:

{2, 3, 4, 5, 6, 7, 8, 9}

frozenset() metodu

a = {1,2,3,4,5,6,7,8,9} 
frozenset(a) #a kümesini donuk küme yaptım

Çıktı:

frozenset({1, 2, 3, 4, 5, 6, 7, 8, 9})