May 7, 2025

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: {} yoki set() 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, KeyError xatosi yuzaga keladi.
sonlar = {1, 2, 3}
sonlar.remove(2)  # Elementni o'chirish
print(sonlar)  # {1, 3} Xato: 4

Maslahat: 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, KeyError yuzaga 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.

  • clear(): Set'dagi barcha elementlarni o'chiradi, natijada bo'sh set qoladi.
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}
  • difference_update(*others): Ayirmani set'ning o'ziga yangilaydi.
a = {1, 2, 3}
b = {2, 3, 4}
a.difference_update(b)
print(a)  # {1}
  • symmetric_difference_update(other): Simmetrik ayirmani set'ning o'ziga yangilaydi.
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

  • isdisjoint(other): Ikkala to'plamning kesishmasi bo'sh bo'lsa, True qaytaradi.
a = {1, 2}
b = {3, 4}
print(a.isdisjoint(b))  # True

c = {2, 3}
print(a.isdisjoint(c))  # False

Foydalanish holati: Ikki to'plam o'rtasida umumiylik yo'qligini tekshirish uchun ishlatiladi.

  • issubset(other) yoki <=: Set boshqa to'plamning ichki to'plami bo'lsa, True qaytaradi. < 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, True qaytaradi. > 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)            # False

Boshqa metodlar

  • copy(): Set'ning sayoz nusxasini (shallow copy) qaytaradi.
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.

  • len(): Set'dagi elementlar sonini qaytaradi.
sonlar = {1, 2, 3}
print(len(sonlar))  # 3
  • in operatori: Elementning set'da mavjudligini tekshiradi.
sonlar = {1, 2, 3}
print(2 in sonlar)    # True
print(4 in sonlar)    # False

Ishlash tartibi: in operatori xesh jadvaldan foydalanadi, shuning uchun O(1) vaqt murakkabligiga ega.

Foydalanish holatlari

  • Takroriy elementlarni olib tashlash:
raqamlar = [1, 2, 2, 3, 3, 4]
yagona = list(set(raqamlar))
print(yagona)  # [1, 2, 3, 4]
  • Guruhlar tahlili:
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'}
  • Tez qidiruv:
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, frozenset ishlatib xotirani tejang.
  • Takroriy operatsiyalar (masalan, in) uchun set ro'yxatdan ancha tezroq.