Set (To'plam)
Set nima?
Set — Python'dagi tartibsiz, takrorlanmaydigan elementlar to'plamini saqlash uchun mo'ljallangan ma'lumot tuzilmasi. U matematik to'plamlar nazariyasiga asoslanadi va elementlarning yagona (unique) bo'lishini ta'minlaydi. Set'lar ichki jihatdan hash table (xesh jadval) asosida ishlaydi, bu esa elementlarni qidirish va qo'shish operatsiyalarini juda tez (O(1) o'rtacha vaqt murakkabligi) amalga oshirish imkonini beradi.
Set'ning asosiy xususiyatlari:
- Tartibsiz: Elementlarning joylashuvi tasodifiy, indeks orqali murojaat qilib bo'lmaydi.
- Takrorlanmaydigan: Har bir element faqat bir marta saqlanadi.
- O'zgartiriladigan (mutable): Set'ga element qo'shish yoki o'chirish mumkin, lekin elementlarning o'zi o'zgarmas (immutable) bo'lishi kerak (masalan, sonlar, satrlar, tuple'lar).
- Hashable elementlar: Set'dagi har bir element hashable bo'lishi kerak, ya'ni u
__hash__metodiga ega bo'lishi lozim (masalan, ro'yxatlar set elementi bo'la olmaydi). - Yaratilishi:
{}yokiset()konstruktorlari orqali yaratiladi.
Set'dan foydalanishning afzalliklari:
- Takroriy elementlarni tez olib tashlash.
- Matematik to'plam operatsiyalari (birikma, kesishma, ayirma).
- Elementlarning mavjudligini tezkor tekshirish.
Set'dan foydalanishning kamchiliklari:
- Tartibsizligi tufayli indeks orqali murojaat qilib bo'lmaydi.
- Faqat o'zgarmas ma'lumot turlari element sifatida ishlatilishi mumkin.
Set yaratish
Set yaratishning bir nechta usullari mavjud:
# Bo'sh set yaratish
empty_set = set() # Faqat set() ishlatiladi, chunki {} bo'sh dict yaratadi
print(empty_set) # set()
# Elementlar bilan set yaratish
sonlar = {1, 2, 3, 4} # To'g'ridan-to'g'ri sintaksis
print(sonlar) # {1, 2, 3, 4}
# Ro'yxatdan set yaratish
matnlar = set(["olma", "banan", "uzum"])
print(matnlar) # {'olma', 'banan', 'uzum'}
# Turli xil ma'lumot turlari bilan set
aralash = {1, "olma", (2, 3)}
print(aralash) # {1, 'olma', (2, 3)}
# Takroriy elementlar avtomatik olib tashlanadi
takroriy = {1, 1, 2, 2, 3}
print(takroriy) # {1, 2, 3}Eslatma: Bo'sh set yaratishda {} ishlatmang, chunki u bo'sh dictionary yaratadi. Bo'sh set yaratishda set() dan foydalaning.
Set metodlari va operatsiyalari
Set'lar bir qator metodlar va operatorlarni qo'llab-quvvatlaydi. Quyida har bir metod va operator chuqur tahlil qilinadi.
Element qo'shish
add(elem): Set'ga bitta element qo'shadi. Agar element allaqachon mavjud bo'lsa, set o'zgarmaydi, chunki set'da takroriy elementlar bo'lmaydi.
mevalar = {"olma", "banan"}
mevalar.add("uzum") # Yangi element qo'shish
print(mevalar) # {'olma', 'banan', 'uzum'}
# Takroriy element qo'shish
mevalar.add("olma") # Hech narsa o'zgarmaydi
print(meyvalar) # {'olma', 'banan', 'uzum'}Ishlash tartibi: add() metodi elementni hash qiladi va uni set'ning ichki xesh jadvaliga joylashtiradi. Agar xesh qiymati allaqachon mavjud bo'lsa, element qo'shilmaydi.
update(*others): Bir yoki bir nechta iteratsiya qilinadigan obyektlardan (ro'yxat, set, tuple va h.k.) elementlarni set'ga qo'shadi. Takroriy elementlar avtomatik olib tashlanadi.
sonlar = {1, 2}
sonlar.update([3, 4], {5, 6}, (7, 7)) # Ro'yxat, set va tuple'dan qo'shish
print(sonlar) # {1, 2, 3, 4, 5, 6, 7}
# Takroriy elementlar bilan
sonlar.update([1, 2, 8])
print(sonlar) # {1, 2, 3, 4, 5, 6, 7, 8}Ishlash tartibi: update() har bir elementni hash qilib, set'ga qo'shadi. Bu operatsiya O(n) vaqt murakkabligiga ega, bu yerda n — qo'shilayotgan elementlar soni.
Element o'chirish
remove(elem): Berilgan elementni set'dan o'chiradi. Agar element mavjud bo'lmasa,KeyErrorxatosi yuzaga keladi.
sonlar = {1, 2, 3}
sonlar.remove(2) # Elementni o'chirish
print(sonlar) # {1, 3} Xato: 4Maslahat: Agar elementning mavjudligiga ishonchingiz komil bo'lmasa, discard() dan foydalaning.
discard(elem): Berilgan elementni set'dan o'chiradi. Agar element mavjud bo'lmasa, hech qanday xato yuzaga kelmaydi.
sonlar = {1, 2, 3}
sonlar.discard(2) # Elementni o'chirish
print(sonlar) # {1, 3}
sonlar.discard(4) # Mavjud bo'lmagan element, xato yo'q
print(sonlar) # {1, 3}Ishlash tartibi: discard() elementi hash qilib, uni xesh jadvaldan olib tashlaydi.
pop(): Set'dan tasodifiy elementni o'chiradi va uni qaytaradi. Set bo'sh bo'lsa,KeyErroryuzaga keladi.
sonlar = {1, 2, 3}
olindi = sonlar.pop() # Tasodifiy element olinadi
print(olindi) # Masalan, 1 (tasodifiy)
print(sonlar) # {2, 3}Eslatma: Set tartibsiz bo'lgani uchun pop() qaysi elementni olib tashlashini oldindan bilib bo'lmaydi.
sonlar = {1, 2, 3}
sonlar.clear()
print(sonlar) # set()Ishlash tartibi: clear() xesh jadvalni tozalaydi, lekin set obyektining o'zi xotirada qoladi.
To'plam operatsiyalari
Set'lar matematik to'plam operatsiyalarini qo'llab-quvvatlaydi. Bu operatsiyalar yangi set qaytaradi yoki mavjud set'ni o'zgartiradi.
union(*others)yoki|: Bir yoki bir nechta to'plamning birikmasini qaytaradi. Barcha elementlar yagona holda birlashtiriladi.
a = {1, 2, 3}
b = {3, 4, 5}
c = {5, 6}
# union metodi
birikma = a.union(b, c)
print(birikma) # {1, 2, 3, 4, 5, 6}
# | operatori
birikma2 = a | b | c
print(birikma2) # {1, 2, 3, 4, 5, 6}Ishlash tartibi: union() barcha elementlarni yangi set'ga qo'shadi, takroriy elementlar xesh jadval orqali olib tashlanadi.
intersection(*others)yoki&: To'plamlarning kesishmasini qaytaradi, ya'ni faqat barcha to'plamlarda mavjud elementlarni o'z ichiga oladi.
a = {1, 2, 3}
b = {2, 3, 4}
c = {2, 3, 5}
# intersection metodi
kesishma = a.intersection(b, c)
print(kesishma) # {2, 3}
# & operatori
kesishma2 = a & b & c
print(kesishma2) # {2, 3}Ishlash tartibi: intersection() har bir elementni barcha to'plamlarda tekshiradi va faqat umumiy elementlarni saqlaydi.
difference(*others)yoki : Birinchi to'plamdan boshqa to'plamlarda mavjud elementlarni olib tashlab, ayirmani qaytaradi.
a = {1, 2, 3, 4}
b = {2, 3}
c = {3, 4}
# difference metodi
ayirma = a.difference(b, c)
print(ayirma) # {1}
# - operatori
ayirma2 = a - b - c
print(ayirma2) # {1}Ishlash tartibi: difference() birinchi to'plamning elementlarini boshqa to'plamlarda tekshiradi va faqat birinchi to'plamda yagona bo'lgan elementlarni qaytaradi.
symmetric_difference(other)yoki^: Ikkala to'plamda faqat birida mavjud bo'lgan elementlarni qaytaradi. Faqat bitta boshqa to'plam bilan ishlaydi.
a = {1, 2, 3}
b = {2, 3, 4}
# symmetric_difference metodi
simmetrik = a.symmetric_difference(b)
print(simmetrik) # {1, 4}
# ^ operatori
simmetrik2 = a ^ b
print(simmetrik2) # {1, 4}Eslatma: symmetric_difference() faqat bitta argument qabul qiladi. Bir nechta to'plam bilan ishlash uchun ketma-ket ^ operatoridan foydalaning.
intersection_update(*others): Kesishmani set'ning o'ziga yangilaydi, ya'ni set faqat umumiy elementlarni saqlaydi.
a = {1, 2, 3}
b = {2, 3, 4}
a.intersection_update(b)
print(a) # {2, 3}a = {1, 2, 3}
b = {2, 3, 4}
a.difference_update(b)
print(a) # {1}a = {1, 2, 3}
b = {2, 3, 4}
a.symmetric_difference_update(b)
print(a) # {1, 4}Ishlash tartibi: Ushbu update metodlari set'ni o'zgartiradi va yangi set yaratmaydi, bu xotirani tejash imkonini beradi.
Tekshiruv metodlari
a = {1, 2}
b = {3, 4}
print(a.isdisjoint(b)) # True
c = {2, 3}
print(a.isdisjoint(c)) # FalseFoydalanish holati: Ikki to'plam o'rtasida umumiylik yo'qligini tekshirish uchun ishlatiladi.
issubset(other)yoki<=: Set boshqa to'plamning ichki to'plami bo'lsa,Trueqaytaradi.<operatori qat'iy ichki to'plamni tekshiradi.
a = {1, 2}
b = {1, 2, 3, 4}
print(a.issubset(b)) # True
print(a <= b) # True
print(a < b) # True (qat'iy ichki to'plam)
print(a <= a) # True
print(a < a) # False (o'ziga o'zi qat'iy ichki to'plam emas)issuperset(other)yoki>=: Set boshqa to'plamni o'z ichiga olsa,Trueqaytaradi.>operatori qat'iy ustun to'plamni tekshiradi.
a = {1, 2, 3, 4}
b = {1, 2}
print(a.issuperset(b)) # True
print(a >= b) # True
print(a > b) # True (qat'iy ustun to'plam)
print(a >= a) # True
print(a > a) # FalseBoshqa metodlar
a = {1, 2, 3}
b = a.copy()
b.add(4)
print(a) # {1, 2, 3}
print(b) # {1, 2, 3, 4}Eslatma: Agar set'da murakkab obyektlar (masalan, tuple ichida ro'yxat) bo'lsa, copy() faqat ularning havolasini nusxalaydi.
sonlar = {1, 2, 3}
print(len(sonlar)) # 3sonlar = {1, 2, 3}
print(2 in sonlar) # True
print(4 in sonlar) # FalseIshlash tartibi: in operatori xesh jadvaldan foydalanadi, shuning uchun O(1) vaqt murakkabligiga ega.
Foydalanish holatlari
raqamlar = [1, 2, 2, 3, 3, 4] yagona = list(set(raqamlar)) print(yagona) # [1, 2, 3, 4]
guruh_a = {"Ali", "Vali", "Sardor"}
guruh_b = {"Sardor", "Hasan", "Husan"}
umumiy = guruh_a & guruh_b
print("Ikkala guruhda:", umumiy) # {'Sardor'}
faqat_a = guruh_a - guruh_b
print("Faqat guruh A:", faqat_a) # {'Ali', 'Vali'}katta_set = set(range(1000000)) print(999999 in katta_set) # True, juda tez (O(1))
Optimallashtirish maslahatlari
- Katta ma'lumotlar bilan ishlashda set'dan foydalaning, chunki u xesh jadval asosida ishlaydi.
- Agar to'plam o'zgarmas bo'lishi kerak bo'lsa,
frozensetishlatib xotirani tejang. - Takroriy operatsiyalar (masalan,
in) uchun set ro'yxatdan ancha tezroq.