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
Nazariya
“Nazariya” bo'limiga havolaLug’at — kalit va qiymat
“Lug’at — kalit va qiymat” bo'limiga havolaLug’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 = {"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) # FalseYo’q kalitga murojaat qilsangiz KeyError chiqadi. Xavfsiz yo’l — get:
jurnal.get("Hasan", 0) kalit bo’lmasa 0 qaytaradi.
Nega lug’at tez
“Nega lug’at tez” bo'limiga havolaLug’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.
Lug’at bo’ylab yurish
“Lug’at bo’ylab yurish” bo'limiga havolajurnal = {"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'rtachaTo’plam — takrorsiz to’da
“To’plam — takrorsiz to’da” bo'limiga havolaTo’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.
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'yxatBashorat qiling
“Bashorat qiling” bo'limiga havolaAvval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.
jurnal = {"Aziza": 5, "Bekzod": 4}jurnal["Aziza"] = 3jurnal["Hasan"] = 2print(len(jurnal))print(jurnal["Aziza"])Haqiqiy natija:
3 3
Mavjud kalitga yozish yangi juftlik qo'shmaydi — qiymatni almashtiradi. Shu sababli uzunlik 3 (Aziza, Bekzod, Hasan), Aziza esa 3 ga o'zgardi.
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.
sonlar = [1, 2, 2, 3, 3, 3]print(len(sonlar))print(len(set(sonlar)))Haqiqiy natija:
6 3
Ro'yxatda 6 element bor, lekin xil qiymatlar uchta: 1, 2, 3. To'plam takrorlarni saqlamaydi.
Javobni ko'rish
6 3
Ro'yxatda 6 element bor, lekin xil qiymatlar uchta: 1, 2, 3. To'plam takrorlarni saqlamaydi.
Sinab ko’r
“Sinab ko’r” bo'limiga havolaIsmni 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- Aziza
- Bekzod
- Dilnoza
- Eldor
- Farida
- Gulnora
- Hasan
- Iroda
- Jasur
- Kamola
- Lola
- Murod
qadam: 0
Lug'at
baho = jurnal[qidirilgan]
qadam: 0
Ism tanlab «Qidirish» tugmasini bosing.
Xatoni toping
“Xatoni toping” bo'limiga havolaBu kod ataylab buzuq — xatoni toping
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.
O’zingizni sinang
“O’zingizni sinang” bo'limiga havola1Lug'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
“Topshiriq” bo'limiga havolaTopshiriq — 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.