2.10. Kümeler¶
Bir küme, benzersiz öğelerden oluşan sırasız bir koleksiyondur. Zaten var olan bir değeri eklemenin hiçbir etkisi yoktur; yineleme her değeri tam olarak bir kez verir. Üyelik ve yinelenenlerin kaldırılması önemliyken ve sıralama önemli değilken kümeler doğru araçtır.
2.10.1. Bir küme oluşturma¶
Boş olmayan bir küme için süslü parantezleri, boş bir küme için ise set() kullanın:
colours = {"red", "green", "blue"}
empty = set()
Parantezler bir dict değişmezi gibi görünür; tek başına {}, boş bir küme değil boş bir dict‘tir – Python’ın tarihsel kazalarından biri. Boş durum için set() kullanın.
set() ayrıca herhangi bir yinelenebilir nesneden bir küme oluşturur ki bu da bir diziden yinelenenleri kaldırmanın standart yoludur:
nums = [1, 2, 2, 3, 1, 4]
unique = set(nums)
print(unique)
Çıktı:
{1, 2, 3, 4}
Yazdırma sırası değişebilir – kümeler belirli bir sırayla yineleme yapacağını garanti etmez.
2.10.2. Küme ve sözlük karşılaştırması¶
Kümeler ve sözlükler her ikisi de benzersiz öğeleri bir hash tablosunda saklar. Her öğenin yanında ne taşıdığı ise farktır:
Bir
dict, anahtar-değer çiftleri saklar. Bir anahtarı aramak değerini döndürür.Bir
set, yalnızca öğeleri saklar. Bir öğeyi aramak, onun orada olup olmadığını size söyler.
İkisi arasındaki seçim, her öğenin yanındaki değerin bir anlam ifade edip etmediğiyle ilgilidir:
Her öğenin yanına ait hiçbir değer olmadığında bir kümeye başvurun – yalnızca öğenin var olup olmadığıyla ilgilenirsiniz ya da benzersiz öğelerden oluşan grupları birleşim / kesişim ile birleştirirsiniz.
Her öğe, aramanın getirmesi gereken verilerle eşleştiğinde bir sözlüke başvurun – bir yapılandırma haritası, bir önbellek, ada göre anahtarlanmış bir sayaç.
İki tür, çok sayıda yüzeysel sözdizimini paylaşır ki kafa karışıklığının çoğu da buradan gelir. Farklar tek bir blokta:
küme |
sözlük |
|
|---|---|---|
tutar |
benzersiz öğeler |
benzersiz anahtarlar, her biri bir değerle |
dolu değişmez |
|
|
boş değişmez |
|
|
üyelik testi |
|
|
bir değer getir |
yok |
|
bir öğe ekle |
|
|
yinele |
öğeleri verir |
anahtarları verir (çiftler için |
Dolu ve boş değişmezler arasındaki asimetri, dikkat çekilmeye değer tuzaktır:
İçinde öğeler bulunan parantezler –
{1, 2, 3}– bir küme değişmezidir; anahtar-değer çiftleri içeren parantezler –{"a": 1}– bir sözlük değişmezidir. Çözümleyici onları içlerinde ne olduğuna göre ayırt eder.İçinde hiçbir şey olmayan parantezler –
{}– boş bir küme değil, boş bir sözlüktür. Sözlükler önce geldi; boş değişmez onlara aittir. Boş bir kümenin parantez değişmezi hiç yoktur veset()olarak yazılmalıdır.
Bir sözlüğün yalnızca anahtarları okunduğunda yaygın bir kalıp, bir kümeye geçmektir – bu, niyeti açık hale getirir ve kullanılmayan değerleri bellekten çıkarır.
2.10.3. Ekleme ve kaldırma¶
set.add()– bir öğe ekler.set.discard()– varsa bir öğeyi kaldırır, yoksa hiçbir şey yapmaz.set.remove()– bir öğeyi kaldırır; yoksaKeyErrorhatası verir.set.clear()– kümeyi boşaltır.
s = {1, 2, 3}
s.add(4)
s.discard(99) # silent: 99 not in s
s.remove(2)
print(s)
Çıktı:
{1, 3, 4}
2.10.4. Üyelik¶
in operatörü üyeliği sınar. Bir kümede boyuttan bağımsız olarak kabaca sabit zaman alır – ki bu da yalnızca “bu değer orada mı” diye sormanız gerektiğinde bir list yerine bir kümeyi seçmenin başlıca nedenidir:
if "red" in colours:
print("colour is allowed")
Aynı içeriğe sahip bir list, her seferinde baştan tarardı ki bu on öğe için sorun değildir ama on bin için yavaştır.
2.10.5. Küme işlemleri¶
İki küme, olağan matematiksel işlemlerle birleştirilebilir. Her birinin hem bir operatör biçimi hem de bir metot biçimi vardır:
a | bveyaa.union(b)– her iki kümede de olan her şey.a & bveyaa.intersection(b)– yalnızca her ikisinde de görünen.a - bveyaa.difference(b)–aiçinde olupbiçinde olmayan.a ^ bveyaa.symmetric_difference(b)– birinde olup her ikisinde olmayan.
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b)
print(a & b)
print(a - b)
print(a ^ b)
Çıktı:
{1, 2, 3, 4, 5, 6}
{3, 4}
{1, 2}
{1, 2, 5, 6}
Operatör biçimleri salt okunurdur; metot biçimleri sağ tarafta yalnızca başka bir küme değil, herhangi bir yinelenebilir nesneyi kabul eder (a.union([5, 6])). Bağlamda hangisi daha iyi okunuyorsa onu seçin.
2.10.6. Bir kümeye ne girebilir¶
Küme öğeleri hashlenebilir olmalıdır – dict anahtarlarıyla aynı kısıtlama. int, float, str, bool, bytes ve tuple (içeriği kendisi hashlenebilir olduğunda) hepsi çalışır. list ve dict çalışmaz; birini eklemeye çalışmak TypeError hatası verir.
2.10.7. frozenset¶
Normal bir set değiştirilebilirdir: add / remove / discard çağrılarının her biri nesneyi yerinde değiştirir. Bu değiştirilebilirlik onu hashlenebilir olmaktan diskalifiye eder, bu nedenle bir küme bir dict anahtarı veya başka bir kümenin üyesi olarak kullanılamaz.
frozenset değiştirilemez karşılığıdır. set ile aynı aramalara ve operatörlere (in, |, &, -, ^) sahiptir ama add / remove ve değişiklik yapan metotları yoktur. İçeriği hiçbir zaman değişemediği için bir frozenset öğesinin hash değeri iyi tanımlıdır – bu yüzden hashlenebilirdir:
primary = frozenset({"red", "green", "blue"})
secondary = frozenset({"yellow", "purple", "orange"})
palettes = {
primary: "RGB",
secondary: "mixed",
}
print(palettes[primary])
Çıktı:
RGB
Herhangi bir yinelenebilir nesneden bir frozenset oluşturun – boş durum için frozenset(), mevcut bir kümenin değiştirilemez bir anlık görüntüsünü almak için frozenset(some_set):
snapshot = frozenset(s) # immutable copy of s
s.add("new") # snapshot does not change
Ona başvurmak için iki yaygın neden:
Bir sözlük anahtarı veya küme üyesi olarak kullanın. Tek bir değerin ihtiyacınız olanı yakalayamadığı her yerde, değerlerden oluşan bir
frozensetyakalayabilir – “bu sürücünün desteklediği özelliklerin kümesi”, “bu profilin kullandığı pinlerin kümesi”.Bir sabiti kilitleyin. İzin verilen adlardan oluşan modül düzeyinde bir
frozenset, bir çağıran tarafından yanlışlıkla değiştirilemez; normal birsetdeğiştirilebilir. Oluşturulduktan sonra salt okunur olması amaçlanan her şey içinfrozensettercih edin.