Kortej va to'plam

Ro'yxat — universal vosita, lekin ba'zan bizga boshqacha xususiyatlar kerak bo'ladi: hech qachon o'zgarmaydigan ma'lumot yoki takrorlanmaydigan qiymatlar. Buning uchun Python'da yana ikkita tuzilma bor.

Bu darsda

  • Kortej (tuple) — o'zgarmas ketma-ketlik
  • Kortejdagi qiymatlarni o'zgaruvchilarga «ochish»
  • To'plam (set) — takrorlanmas qiymatlar
  • Ro'yxatdan takrorlarni olib tashlash
  • To'plamlar ustida amallar: birlashma, kesishma, ayirma

Kortej (tuple)

Kortej — ro'yxatga juda o'xshaydi, faqat u oddiy qavslar ( ) bilan yoziladi va yaratilgandan keyin o'zgartirib bo'lmaydi:

hafta_kunlari = ("dushanba", "seshanba", "chorshanba", "payshanba", "juma", "shanba", "yakshanba")
print(hafta_kunlari[0])
print(hafta_kunlari[-1])
print(len(hafta_kunlari))
print("juma" in hafta_kunlari)
dushanba
yakshanba
7
True

Indekslar, kesmalar, len(), in va for sikli — hammasi ro'yxatdagidek ishlaydi. Faqat o'zgartirishga urinsangiz, xato chiqadi:

hafta_kunlari = ("dushanba", "seshanba", "chorshanba")
hafta_kunlari[0] = "yakshanba"

Kortej nima uchun kerak?

Bitta elementli kortej yaratishda vergul qo'yish shart: (5,). Vergulsiz (5) — bu oddiy qavs ichidagi son 5.

Qiymatlarni ochish

Kortejdagi qiymatlarni bir qatorda alohida o'zgaruvchilarga olish mumkin. Bu ochish (inglizcha unpacking) deyiladi:

toshkent = (41.31, 69.28)
kenglik, uzunlik = toshkent
print("Kenglik:", kenglik)
print("Uzunlik:", uzunlik)

sana = (21, "mart", 2027)
kun, oy, yil = sana
print(f"Navro'z: {kun}-{oy}, {yil}-yil")

6-darsda ko'rgan a, b = b, a almashtirish usuli ham aynan shu mexanizmga asoslangan: o'ng tomonda (b, a) korteji yaratiladi va darhol a va b ga ochiladi.

To'plam (set)

To'plam — takrorlanmaydigan qiymatlar to'plami. U figurali qavslar { } bilan yoziladi. Bir xil qiymatni ikki marta qo'shib bo'lmaydi — takrorlar avtomatik olib tashlanadi:

sonlar = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3}
print(sonlar)
print(len(sonlar))
{1, 2, 3, 4, 5, 6, 9}
7

10 ta son yozdik, lekin to'plamda faqat 7 ta qoldi — takrorlar yo'qoldi.

To'plamda tartib yo'q: elementlar qanday tartibda chiqishi kafolatlanmaydi va indeks bilan murojaat qilib bo'lmaydi (toplam[0] — xato). Tartib kerak bo'lsa, sorted(toplam) ishlating — u saralangan ro'yxat qaytaradi.

Ro'yxatdan takrorlarni olib tashlash

To'plamning eng ko'p ishlatiladigan qo'llanishi — takrorlarni yo'qotish:

tashrif_buyuruvchilar = ["Ali", "Vali", "Ali", "Sora", "Vali", "Ali", "Hasan"]
noyob = set(tashrif_buyuruvchilar)
print("Jami tashriflar:", len(tashrif_buyuruvchilar))
print("Turli odamlar:", len(noyob))
print(sorted(noyob))
Jami tashriflar: 7
Turli odamlar: 4
['Ali', 'Hasan', 'Sora', 'Vali']

Qo'shish va o'chirish

teglar = set()            # bo'sh to'plam
teglar.add("python")
teglar.add("dasturlash")
teglar.add("python")      # takror — hech narsa o'zgarmaydi
print(len(teglar))

teglar.discard("dasturlash")
print(teglar)

Bo'sh to'plam faqat set() bilan yaratiladi. Bo'sh figurali qavs {} esa bo'sh lug'at yaratadi — u bilan keyingi darsda tanishamiz.

remove(x) ham elementni o'chiradi, lekin x to'plamda bo'lmasa, xato beradi. discard(x) esa bunday holatda jim o'tib ketadi.

To'plamlar ustida amallar

Maktabdagi matematikadan tanish amallar Python'da ham bor:

AmalBelgiMa'nosi
Birlashmaa | bIkkalasidagi barcha elementlar
Kesishmaa & bIkkalasida ham bor elementlar
Ayirmaa - ba da bor, lekin b da yo'q elementlar
shaxmat = {"Aziz", "Dilnoza", "Jasur", "Malika"}
futbol = {"Jasur", "Bekzod", "Aziz", "Sardor"}

print("Ikkala to'garakda:", sorted(shaxmat & futbol))
print("Faqat shaxmatda:", sorted(shaxmat - futbol))
print("Jami o'quvchilar:", len(shaxmat | futbol))
Ikkala to'garakda: ['Aziz', 'Jasur']
Faqat shaxmatda: ['Dilnoza', 'Malika']
Jami o'quvchilar: 6

Qaysi birini tanlash kerak?

TuzilmaYozilishiTartibO'zgaradimiTakrorQachon
Ro'yxat[1, 2]borhamumkinKo'p hollarda — standart tanlov
Kortej(1, 2)boryo'qmumkinO'zgarmas, bog'liq ma'lumotlar
To'plam{1, 2}yo'qhayo'qTakrorlarni yo'qotish, umumiy elementlarni topish

Mashqlar

1-mashq Turli so'zlar

Gapda nechta turli so'z borligini toping.

gap = "bir ikki bir uch ikki bir"
Yechimni ko'rish
gap = "bir ikki bir uch ikki bir"
print(len(set(gap.split())))

2-mashq Umumiy sonlar

Ikki ro'yxatda ham uchraydigan sonlarni saralangan ro'yxat ko'rinishida chiqaring.

a = [1, 2, 3, 4, 5]
b = [4, 5, 6, 7]
Yechimni ko'rish
a = [1, 2, 3, 4, 5]
b = [4, 5, 6, 7]
print(sorted(set(a) & set(b)))

3-mashq Sana

sana kortejini uchta o'zgaruvchiga oching va 1.9.1991 ko'rinishida chiqaring.

sana = (1, 9, 1991)
Yechimni ko'rish
sana = (1, 9, 1991)
kun, oy, yil = sana
print(kun, oy, yil, sep=".")

1991-yil 1-sentabr — O'zbekiston Mustaqilligi kuni.

4-mashq Yetishmayotgan raqamlar

Ro'yxatda 1 dan 10 gacha sonlarning ba'zilari yo'q. Qaysilari yetishmayotganini saralangan ro'yxat ko'rinishida toping.

mavjud = [7, 1, 3, 10, 4, 8, 6]
Ishora

set(range(1, 11)) — 1 dan 10 gacha barcha sonlar to'plami. Undan mavjudlarini ayiring.

Yechimni ko'rish
mavjud = [7, 1, 3, 10, 4, 8, 6]
hammasi = set(range(1, 11))
print(sorted(hammasi - set(mavjud)))

O'zingizni sinang

Kortejning ro'yxatdan asosiy farqi nimada?

  1. Kortejda faqat sonlar bo'ladi
  2. Kortejni yaratilgandan keyin o'zgartirib bo'lmaydi
  3. Kortejda indekslar 1 dan boshlanadi
  4. Kortejda takror bo'lmaydi

To'g'ri. Kortej — o'zgarmas ketma-ketlik.

len({1, 2, 2, 3, 3, 3}) nimaga teng?

  1. 6
  2. 1
  3. 3
  4. 2

To'g'ri. To'plamda takrorlar saqlanmaydi: faqat 1, 2, 3 qoladi.

Bo'sh to'plam qanday yaratiladi?

  1. set()
  2. {}
  3. []
  4. ()

To'g'ri. {} — bo'sh lug'at, [] — bo'sh ro'yxat, () — bo'sh kortej.

{1, 2, 3} & {2, 3, 4} nimaga teng?

  1. {1, 2, 3, 4}
  2. {1}
  3. {4}
  4. {2, 3}

To'g'ri. & — kesishma: ikkala to'plamda ham bor elementlar.

Xulosa

  • Kortej (1, 2, 3) — o'zgarmas ketma-ketlik. U bog'liq va o'zgarmas ma'lumotlar uchun qulay.
  • Kortejni o'zgaruvchilarga ochish mumkin: kun, oy, yil = sana.
  • To'plam {1, 2, 3} — takrorlanmas qiymatlar, tartibsiz. Bo'sh to'plam — set().
  • set(royxat) takrorlarni olib tashlaydi.
  • | — birlashma, & — kesishma, - — ayirma.