Set Veri Tipi Hakkında

Merhaba üstadlar,
Örneğin elimizde bir sets tip listemiz olsun ;
test = {'Ali', 'Veli', 'Mehmet'}
Daha sonra listeyi güncelleyelim ;
test.update(['Kenan', 'Rıza', 'Ziya', 'Bilmemne'])

Öğrenmek istediğim ise ; print ile yazdırdığımda liste neden karışık bir şekilde geliyor? Diğer liste tiplerindeki gibi sıraya göre gelmiyor? Her defasında karışık bir şekilde veriyor elemanları

set() index tutmayan veri tipidir. Bu sebeple her seferinden farklı sıralamada verir. Bu veri tipini random gereksinimi için de kullanabilirsin.

1 Beğeni

Aaaa doğru yaa, hatta notlarda bile şöyle bir şey yazmıştım ;
# Peki normal listelerden farkı ne?
# Normal bir listeye index numaralarıyla ulaşabilirken, Sets tipinde bir listeye index numarasınla ulaşamayız.
# İndekslenemez bir liste türüdür.

Tamam hocam çok ama çok teşekkür ederim :slight_smile:

Merhaba.

set başlı başına bir veri tipi, listelerle alakası yok. Hatta implementasyonu dict’e daha çok benziyor.

Çünkü set’lerin for döngüsü ile üzerinden geçildiğinde veya ekrana yazdırıldığında elde ettiğimiz elemanların sırasının, o set’e elemanları ekleme sıramız ile alakası yok.

Dediğim gibi, set tipi ile list tipi farklı. “liste tipleri” diye bir şey de yok, demek istediğiniz normalde “sequence” olarak geçiyor. Sanırım Türkçe’ye “dizi” olarak çevirebiliriz. “sequence” dediğimiz şey belirli bir veri tipini ifade etmiyor, daha çok veri tiplerinin nasıl davrandığı ile alakalı. set bir sequence tipi değil bu arada.

“Normal liste” yok, list var. set, indekslenemeyen bir liste türü değil; bir tür.

Vermeyebilir de. Hatta üzerinde bir değişim (herhangi bir şekilde eleman ekleme veya silme) yapmadığımız sürece verdiği sıralama hep aynı. Ayrıca bir veri tipinin sahip olduğu elemanların eklenme sırası hakkında veri barındırmaması, her seferinde farklı sıralama vermesi için bir sebep değil.

Yukarıdaki durumdan dolayı bu anlamsız. Zaten set’in elemanlarının sıralaması rastgele de değil, sadece elemanların eklenme sırası hakkında bir bilgi vermiyor. Rastgele işlemler için random modülü kullanılmalı.

5 Beğeni

Öncelikle çok ama çok teşekkür ederim. Ekrem hocam bize hoca bir liste türü diye anlattı o yüzden bende böyle yazdım. Hatta ders notlarında bile liste türü diye kaydettim. Hocanın sözleriyle beraber tam olarak bu konuyla ilgili aldığım notlar şöyle ; (Hoca bu şekilde anlattı)

"                                           Sets pythonda bir liste tipidir                             "

# Bir set tanımlamak için tanımlamayı süslü parantezler '{ }' arasında yaparız.

fruits = {'orange', 'apple', 'banana'}

print(fruits) # Çıktısı → → {'orange', 'apple', 'banana'}

# Peki normal listelerden farkı ne?

# Normal bir listeye index numaralarıyla ulaşabilirken, Sets tipinde bir listeye index numarasınla ulaşamayız.   ###### ARAŞTIR NEDEN?#########

# İndekslenemez bir liste türüdür.

# Peki elemanlarına nasıl ulaşabiliriz? Bir döngü kullanarak.

# Gelin isterseniz bakalım ;

for degisken in fruits:

    print(degisken)

# Yukarıda tam olarak şunu yaptık ; meyveleri degisken'e aktar, print ile degiskeni ekrana yazdır.

#Sets liste tipini, a-z türünde, veya sayısal bir değerde 1-9 gibi sıralayamayız.

# Listenin üzerine eleman eklemek istersek ne yapmalıyız ?

# add() metoduyla yeni bir eleman eklemek mümkün.

fruits.add('cherry') # add() metodu ile birden fazla eleman ekleyemeyiz, birden fazla eleman eklemek istersek, add() metodu ile tek tek eklemeliyiz;

fruits.add('passion') # Gibi.

# Ancak birden fazla ekleme yapmak istersek, daha öncede dictionary tipte gördüğümüz gibi listeyi güncelleyebiliriz, elbette update() metoduyla.

fruits.update(['Mandarin', 'Black mulberry', 'Mango', 'Grape'])# liste içerisinde liste oluşturma yöntemiyle ekleme yaptık.

# Karışık olarak listenin bize geldiğini görüyoruz. Çünkü indexlenemez bir liste tip olduğu için elemanlar her defasında farklı olarak gelmektedir.

# Bu veri tipini random gereksinimi içinde kullanabiliriz... :)

print(fruits)

# Eğer liste içerisinde olan bir elemanı yeniden eklemeye çalışırsak, elemanlar tekrarlanmaz. Bir eleman sadece bir defa eklenir.

# Şimdi sayısal bir liste tanımlayalım ve içinde tekrar eden elemanların nasıl elendiğini birlikte görelim.

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

print(number) # Gördüğünüz gibi tekrar eden elemanların tamamı silindi.

# Normal bir liste oluşturalım, ve set() constructoruna gönderelim ve tekrar eden elemanlar yine silinsin.

normalNumber = [0,1,0,2,1,3,0,4,5,6,5,7]

print(normalNumber)#Burada listeyi olduğu gibi yazarken,

print(set(normalNumber)) # Burada tekrar eden elemanları listeye dahil etmiyor.

# silme işlemi yapamk istersek ne yapmalıyız ?

# remove() metodu aracılığıyla değer belirterek bunu basitçe gerçekleştirebiliriz ;

fruits.remove('apple')

print(fruits) # Veya discard() metodu aracılığıyla bunu yapabiliriz.

fruits.discard('passion')

print(fruits) # Veya ;

# pop() metodu listelerde son elemanı siliyordu, fakat burada elemanlardan herhangi birini silebilir çünkü elemanların yerleri sürekli değişiyor print ile kontrol edin.

'fruits.pop()' # Yine sona hangi eleman gelirse onu silecektir, bunu kullanırken dikkatli olmak gerekir.

#Bütün elemanları temizlemek istersek eğer listelerdende bildiğimiz gibi clear() metodunu kullanmalıyız.

'fruits.clear()'

Anladım. set’ler for döngüsü ile birlikte kullanılabildiği için (yani iterable olduğu için) hocanız böyle bir anlatım yapmış sanırım, çünkü listeler ile tek benzerliği bu. Ama doğru olduğu söylenemez, bu şekilde düşünürsek dict de bir liste türü (?) olur, sonuçta onun da anahtarlarına for döngüsü ile erişebiliyoruz.

Bu terimlerin doğrusu ise “iterable” ve yukarıda bahsettiğim sequence. Iterable nesneler for döngüsü ile kullanılabilen nesnelerdir. set de list de dict de birer iterable’dır. Sequence’lerin ise len fonksiyonu ile kullanılabilmesi, iterable olması ve tam sayı indisler ile elemanlarına erişilebilmesi lazım. list bu kurallara uyuyor ama set uymuyor.

2 Beğeni

Hata tekrar edildigi icin hata oldugunu tekrar yazacagim: setlerin listelerle pek bir alakalari yok. @EkremDincel’in dedigi gibi maplere (dict) daha yakinlar. En basidinden; listeler sonsuz, setler degil.*

Daha cok in ve not in operatorlerini kullanarak. Veya diger set operasyonlarini. Elemanlarinin tamamina ulasmak pek kullanilan bir operasyon (islem) degil.

Tam olarak fruits ifadesinden iter() kullanarak bir iterator yarattik, StopIteration throw edene kadar __next__ metodunu cagirdik, ve etmedigi her degeri sirayla degisken’e atayip loop’un govdesi olan print(degisken) ifadesini degerlendirdik.

Yaklasik olarak meyveleri degisken’e aktarip print ile ekrana yazdik, ama bunu teker teker, sirayla yaptigimizi belirtmekte fayda var.

Turun kendisinin de, tuttugu degerlerin de siralanamamalari gibi bir durum yok. Sadece bir iterator ile sekansa (listeye) cevrildiginde sekansin icindeki degerlerin herhangi bir sirada olacaklari garanti edilmiyor.

Random gereksiniminin içi nedir bilmiyorum ama set’leri bir rastgelelik kaynagi olarak kullanamayiz.


*: Bazen boyle cumle arasinda yazdigim seyler merak ve/veya tartisma uyandiriyor. Guzel :​)

3 Beğeni

Burayı tam anlamadım hocam setlerin sınırı nedir?
:slight_smile:

Hepinize sonsuzz teşekkürler :)) Çok daha iyi anladım bazı şeyleri :slight_smile: Iyiki acmısım bu konuyu :smiley: