Asosiy mazmunga o'tish

11-dars: Lug'at va to'plam

3-blokMa'lumotni saqlash9–12 darslar

Bu darsdan keyin siz

  • lug’at yaratasiz, kalit orqali qiymat olasiz va o’zgartirasiz
  • lug’at nega tez ishlashini hash orqali tushuntirasiz
  • to’plamdan takrorlarni yo’q qilish uchun foydalanasiz

Lug’at figurali qavslar bilan yoziladi: {"Aziza": 5, "Bekzod": 4}. Chapdagi — kalit, o’ngdagi — qiymat. Murojaat indeks bilan emas, kalit bilan bo’ladi.

lug'atdictionary

Kalit–qiymat juftliklaridan iborat tuzilma. Kalit takrorlanmaydi va o’zgarmas turdan bo’lishi kerak (satr, son). Qiymat istalgan narsa bo’lishi mumkin.

jurnal.py
jurnal = {"Aziza": 5, "Bekzod": 4}print(jurnal["Aziza"])       # 5jurnal["Dilnoza"] = 3        # yangi juftlik qo'shildijurnal["Bekzod"] = 5         # mavjud qiymat almashdiprint(len(jurnal))           # 3print("Hasan" in jurnal)     # False

Yo’q kalitga murojaat qilsangiz KeyError chiqadi. Xavfsiz yo’l — get: jurnal.get("Hasan", 0) kalit bo’lmasa 0 qaytaradi.

Lug’at kalitni hash funksiyasidan o’tkazadi: kalitdan son chiqadi, son esa qaysi katakka qarash kerakligini aytadi. Shu sababli elementlar sonidan qat’i nazar qidiruv bir qadamda bo’ladi.

hashhash

Ma’lumotdan qat’iy uzunlikdagi son hosil qiluvchi funksiya. Bir xil kalit har doim bir xil son beradi — CF 14 va CF 19-darslarda uchragan tushuncha.

Kalit o’zgarmas turdan bo’lishi shu bilan izohlanadi: kalit o’zgarsa, hash ham o’zgaradi va qiymat «adashib qoladi». Shu sababli ro’yxatni kalit qilib bo’lmaydi.

aylanish.py
jurnal = {"Aziza": 5, "Bekzod": 4, "Dilnoza": 3}for ism in jurnal:  print(ism, jurnal[ism])for ism, baho in jurnal.items():  print(ism, "->", baho)print(sum(jurnal.values()) / len(jurnal))   # o'rtacha

To’plam (set) ham figurali qavs bilan yoziladi, lekin faqat qiymatlardan iborat. Ikki xususiyati bor: takror saqlanmaydi va tartib yo’q. Takrorlarni yo’qotishning eng qisqa yo’li — ro’yxatni to’plamga aylantirish.

toplam.py
baholar = [5, 4, 5, 3, 4, 5]xillari = set(baholar)print(xillari)            # {3, 4, 5}print(len(xillari))       # 3 xil bahoprint(sorted(xillari))    # [3, 4, 5] — tartiblangan ro'yxat

Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.

Bashorat qiling
jurnal = {"Aziza": 5, "Bekzod": 4}jurnal["Aziza"] = 3jurnal["Hasan"] = 2print(len(jurnal))print(jurnal["Aziza"])
Javobni ko'rish
3
3

Mavjud kalitga yozish yangi juftlik qo'shmaydi — qiymatni almashtiradi. Shu sababli uzunlik 3 (Aziza, Bekzod, Hasan), Aziza esa 3 ga o'zgardi.

Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.

Bashorat qiling
sonlar = [1, 2, 2, 3, 3, 3]print(len(sonlar))print(len(set(sonlar)))
Javobni ko'rish
6
3

Ro'yxatda 6 element bor, lekin xil qiymatlar uchta: 1, 2, 3. To'plam takrorlarni saqlamaydi.

Ismni tanlab «Qidirish» ni bosing. Chapda ro’yxat bittalab tekshiradi, o’ngda lug’at hash orqali darhol kerakli katakka boradi. Qadam hisoblagichlarini solishtiring.

Hash qutisi

Ismni tanlang va ikki qidiruvni solishtiring: ro'yxat bittalab, lug'at bir zumda.

Bu simulyator bir xil sinf jurnalini ikki tuzilmada saqlaydi. Ism qidirilganda ro'yxat elementlarni bittalab tekshiradi, lug'at esa ismdan hash hisoblab to'g'ridan-to'g'ri kerakli katakka boradi.

JavaScript'siz sinash: 12 ismli ro'yxatda oxirgi ismni qidirish uchun necha marta solishtirish kerak? (12 marta.) Lug'atda esa hash bir marta hisoblanadi va bitta katak ochiladi.

Ro'yxat

for ism, baho in jurnal:
    if ism == qidirilgan:
        return baho
  1. Aziza
  2. Bekzod
  3. Dilnoza
  4. Eldor
  5. Farida
  6. Gulnora
  7. Hasan
  8. Iroda
  9. Jasur
  10. Kamola
  11. Lola
  12. Murod

qadam: 0

Lug'at

baho = jurnal[qidirilgan]
0Aziza, Dilnoza, Gulnora, Lola
1Hasan, Murod
2Farida, Kamola
3
4
5Bekzod, Eldor, Iroda
6Jasur

qadam: 0

Ism tanlab «Qidirish» tugmasini bosing.

Bu kod ataylab buzuq — xatoni toping

Buzuq kod
jurnal = {"Aziza": 5, "Bekzod": 4}print(jurnal["Hasan"])

Python shunday javob beradi:

Traceback (most recent call last):
File "jurnal.py", line 2, in <module>
  print(jurnal["Hasan"])
KeyError: 'Hasan'
Sababi va tuzatish

Bunday kalit lug'atda yo'q. Python taxmin qilmaydi va bo'sh qiymat ham qaytarmaydi — darhol xato beradi.

Ikki yechim: oldindan tekshirish (if "Hasan" in jurnal:) yoki standart qiymatli get (jurnal.get("Hasan", 0)). Ikkinchisi qisqaroq, lekin «kalit yo’q» holatini yashiradi — qaysi biri kerakligini masala hal qiladi.

1Lug'atda murojaat nima bilan bo'ladi — indeks bilanmi?

Javobni ko'rish

Kalit bilan: jurnal[“Aziza”]. Indeks yo’q, chunki lug’atda tartib murojaat uchun ishlatilmaydi.

2Nega lug'atda qidiruv elementlar soniga bog'liq emas?

Javobni ko'rish

Kalitdan hash hisoblanadi va u to’g’ridan-to’g’ri kerakli katakni ko’rsatadi. Boshqa elementlar tekshirilmaydi.

3Nega ro'yxatni lug'at kaliti qilib bo'lmaydi?

Javobni ko'rish

Ro’yxat o’zgaruvchan: uning ichi o’zgarsa hash ham o’zgaradi va qiymat topilmay qoladi. Kalit o’zgarmas turdan bo’lishi kerak.

4Yo'q kalitga murojaat qilsa nima bo'ladi va qanday himoyalanish mumkin?

Javobni ko'rish

KeyError chiqadi. Himoya: if kalit in lugat tekshiruvi yoki lugat.get(kalit, standart).

5[5, 4, 5, 3] ro'yxatida nechta xil baho borligini qanday topasiz?

Javobni ko'rish

len(set(baholar)) — natija 3. To’plam takrorlarni tashlab yuboradi.

Topshiriq — darajangizni tanlang

Asos · 5–7-sinf — Vizual va aniq ko'rsatmali

Beshta sinfdoshingizning ismi va bahosidan lug’at tuzing. Bitta bahoni o’zgartiring, yangi o’quvchi qo’shing, bittasini del bilan o’chiring. Keyin for bilan hammasini «Ism: baho» ko’rinishida chiqaring va o’rtacha bahoni hisoblang.

Mustahkam · 8–9-sinf — Matnli masala, o'zingiz tuzasiz

Matndagi so’zlarni sanovchi programma yozing: matnni split() bilan bo’lib, har so’z nechta uchraganini lug’atda hisoblang. Keyin eng ko’p uchragan so’zni toping. get metodidan foydalanish kodni qanday qisqartirganini izohda yozing.

Chuqur · 10–11-sinf — Algoritmik, chegara holatlari bilan

7-darsdagi modani topish masalasini endi lug’at bilan yeching va qadamlar sonini eski (faqat ro’yxatli) yechim bilan solishtiring. Keyin ikki sinf ro’yxatini to’plam amallari bilan tahlil qiling: ikkisida ham bor ismlar (kesishma), faqat birinchisida borlar (ayirma), umumiy ro’yxat (birlashma). Chegara holati: bo’sh to’plamlar.

Darsni belgilash uchun JavaScript kerak. Bu progressni saqlash uchun ishlatiladi — darslikning o'zi JavaScript'siz ham to'liq o'qiladi.