İçeriğe geç
Educora
Orta14 dk7 / 42

Demetler ve kümeler

Değişmemesi gereken veriler için demetleri, tekrarsız topluluklar için kümeleri kullanmayı öğren.

Kendini test et
Bu derste öğreneceklerin
  • Demet oluşturmak ve onu açmak (unpacking)
  • Liste, demet ve küme arasındaki farkı açıklamak
  • Kümelerle tekrarları silmek ve birleşim, kesişim, fark işlemlerini yapmak

Bazı veriler asla değişmemelidir: haftanın günleri, Bakü'nün coğrafi koordinatları, bir rengin RGB kodu. Bazen de yalnızca tekrarsız değerlere ihtiyaç duyarsın: örneğin bir siteye hangi şehirlerden girildiğini bilmek istiyorsun ama her şehri bir kez saymak şartıyla. Python'da bu iki iş için özel türler vardır: demet ve küme.

Demetler

Tanım
Demet (tuple)

Normal parantez () içinde yazılan sıralı bir değerler topluluğu. Listeye benzer ama oluşturulduktan sonra değiştirilemez.

Python
baku = (40.41, 49.87)
print(baku)
print(baku[0])
print(len(baku))

days = ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun')
print(days[-1], days.index('Wed'))
▸ Beklenen çıktı
(40.41, 49.87)
40.41
2
Sun 2

İndeksler, dilimler, len(), in ve for döngüsü demetlerde de çalışır. Ama days[0] = 'Monday' yazarsan Python TypeError: 'tuple' object does not support item assignment hatası verir. Bu aslında bir avantajdır: programın hiçbir parçası önemli verileri yanlışlıkla değiştiremez.

Demetlerin en kullanışlı özelliği açmadır (unpacking): elemanları tek satırda ayrı değişkenlere yazabilirsin. Aynı yöntemle iki değişkenin değerini yardımcı bir değişken olmadan yer değiştirebilirsin.

Python
lat, lon = (40.41, 49.87)
print('Latitude:', lat)
print('Longitude:', lon)

a = 5
b = 8
a, b = b, a
print(a, b)
▸ Beklenen çıktı
Latitude: 40.41
Longitude: 49.87
8 5

Açma, döngülerde de çalışır. enumerate() fonksiyonu her elemanı numarasıyla birlikte (numara, eleman) demeti olarak verir; bir listeyi numaralandırmanın en kolay yolu budur. start=1, saymanın 1'den başlamasını sağlar.

Python
students = ['Aysel', 'Murad', 'Leyla']
for number, name in enumerate(students, start=1):
    print(f'{number}. {name}')

print(list(enumerate('ab')))
▸ Beklenen çıktı
1. Aysel
2. Murad
3. Leyla
[(0, 'a'), (1, 'b')]

Kümeler

Tanım
Küme (set)

Süslü parantez {} içinde yazılan, tekrarsız elemanlardan oluşan bir topluluk. Kümede elemanların sırası yoktur, bu yüzden indeks kullanılamaz.

Küme tekrarları otomatik olarak atar. Bir listeyi set() fonksiyonuna verirsen her değerden yalnızca biri kalır. Kümenin sırası olmadığı için onu düzgün yazdırmak amacıyla sorted() ile sıralarız.

Python
print({3, 1, 2, 3, 1})

visitors = ['Baku', 'Ganja', 'Baku', 'Shaki', 'Ganja', 'Baku']
unique = set(visitors)
print(len(visitors), len(unique))
print(sorted(unique))

unique.add('Quba')
unique.add('Baku')
print(len(unique))
print('Shaki' in unique)
▸ Beklenen çıktı
{1, 2, 3}
6 3
['Baku', 'Ganja', 'Shaki']
4
True

Dikkat: 'Baku' zaten kümede olduğu için onu yeniden eklemek hiçbir şeyi değiştirmedi; eleman sayısı 5 değil, 4 oldu. in ile kontrol, kümelerde listelere göre çok daha hızlı çalışır.

Örnek: tekrarsız kelimeler

“the sun and the moon and the stars” cümlesinde kaç kelime var ve bunların kaçı tekrarsız?

Çözümü göster
split() cümleyi 8 kelimelik bir listeye böler.
set() tekrarları atar; geriye the, sun, and, moon, stars kalır.
Cevap: 8 kelime, bunların 5'i tekrarsız.
Python
text = 'the sun and the moon and the stars'
words = text.split()
print(len(words), 'words,', len(set(words)), 'unique')
▸ Beklenen çıktı
8 words, 5 unique

Küme işlemleri

Matematikten bildiğin küme işlemleri Python'da tek bir sembolle yazılır. Diyelim ki okulda bir satranç kulübü ve bir robotik kulübü var. Hangi öğrenciler ikisine de gidiyor?

İşlemYazımSonuç
Birleşima | ba'da ya da b'de olan tüm elemanlar
Kesişima & bhem a'da hem b'de olanlar
Farka - ba'da olup b'de olmayanlar
Simetrik farka ^ byalnızca birinde olanlar
Python
chess = {'Aysel', 'Murad', 'Elvin'}
robotics = {'Murad', 'Leyla', 'Elvin', 'Nigar'}

print(sorted(chess & robotics))
print(sorted(chess | robotics))
print(sorted(chess - robotics))
print(sorted(chess ^ robotics))
▸ Beklenen çıktı
['Elvin', 'Murad']
['Aysel', 'Elvin', 'Leyla', 'Murad', 'Nigar']
['Aysel']
['Aysel', 'Leyla', 'Nigar']

Hangisini seçmeli?

ÖzellikListeDemetKüme
Yazım[1, 2](1, 2){1, 2}
Değiştirilebilir mi?evethayırevet
Sıralı mı?evetevethayır
Tekrar olabilir mi?evetevethayır
Ne zaman kullanılır?değişen bir topluluksabit verilertekrarsız elemanlar, hızlı arama
Alıştırma

results listesinin her elemanı bir ad ve puandan oluşan bir demettir, örneğin ('Aysel', 91). enumerate() ve demet açmayı kullanarak sonuçları 1'den başlayan numaralarla, 1. Aysel - 91 biçiminde yazdır.

Alıştırma · Python
results = [('Aysel', 91), ('Murad', 78), ('Leyla', 85)]
# print: 1. Aysel - 91, then 2. Murad - 78, ...
▸ Beklenen çıktı
1. Aysel - 91
2. Murad - 78
3. Leyla - 85
Alıştırma

Bir kulübe pazartesi ve salı günü gelen öğrencilerin listeleri verilmiş (adlar tekrar edebilir). Kümeleri kullanarak üç satır yazdır: 1) pazartesi kaç farklı öğrenci geldi, 2) iki gün de gelenlerin alfabetik listesi, 3) toplamda kaç farklı öğrenci geldi.

Alıştırma · Python
monday = ['Aysel', 'Murad', 'Leyla', 'Aysel', 'Elvin']
tuesday = ['Leyla', 'Nigar', 'Murad', 'Nigar']
# 1) number of different pupils on Monday
# 2) sorted list of pupils who came on both days
# 3) number of different pupils in total
▸ Beklenen çıktı
4
['Leyla', 'Murad']
5

Önemli noktalar

  • Demet, () içinde sıralı ama değiştirilemeyen bir topluluktur.
  • Açma, tek satırda birkaç değişkene değer atar: lat, lon = point.
  • Küme, {} içinde tekrarsız ve sırasız elemanlardır; set(list) tekrarları siler.
  • | birleşimi, & kesişimi, - farkı, ^ simetrik farkı verir.
  • Boş küme set() ile oluşturulur; {} boş bir sözlüktür.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Demetin listeden temel farkı nedir?