Asosiy mazmunga o'tish

12-dars: Ichma-ich tuzilmalar

3-blokMa'lumotni saqlash9–12 darslar

Bu darsdan keyin siz

  • real ma’lumotni mos tuzilmalar bilan modellashtirasiz
  • ichma-ich tuzilmaga qavat-qavat murojaat qilasiz
  • ichma-ich sikl bilan butun tuzilmani aylanib chiqasiz

Yangi tuzilma o’ylab topish kerak emas — mavjudlarini bir-birining ichiga solish kifoya. Har qavat bitta savolga javob beradi: ro’yxat «tartib bilan nechta», lug’at «kimning nimasi».

tuzilma.py
# Lug'at ichida ro'yxat: har o'quvchining bir nechta bahosibaholar = {"Aziza": [5, 4, 5], "Bekzod": [4, 3]}print(baholar["Aziza"][1])        # 4# Lug'at ichida lug'at: kim, qaysi fandanjurnal = {"Aziza": {"matematika": 5, "fizika": 4}}print(jurnal["Aziza"]["fizika"])  # 4

jurnal["Aziza"]["fizika"] sirli ko’rinadi, lekin u ikki oddiy qadam: avval jurnal["Aziza"] bajariladi va natijada lug’at chiqadi, keyin o’sha lug’atdan ["fizika"] olinadi.

ichma-ich tuzilmanested structure

Bir tuzilmaning elementi sifatida boshqa tuzilma turishi. Har qavat mustaqil o’qiladi, shuning uchun murakkab ko’rinishdan qo’rqmaslik kerak.

Bir turdagi yozuvlar ko’p bo’lganda bu shakl qulay — masalan har o’quvchi bitta yozuv bo’lgan jadval.

jadval.py
oquvchilar = [  {"ism": "Aziza", "sinf": "9-A", "baho": 5},  {"ism": "Bekzod", "sinf": "9-B", "baho": 4},]for o in oquvchilar:  print(o["ism"], o["sinf"], o["baho"])

Bu aynan 18-darsda CSV fayldan o’qiladigan shakl — shuning uchun uni yaxshi o’zlashtirish keyin ish beradi.

Tashqi sikl o’quvchilar bo’ylab, ichki sikl har o’quvchining fanlari bo’ylab yuradi — 8-darsdagi ichma-ich sikl, faqat range o’rniga tuzilma.

ortacha.py
jurnal = {  "Aziza": {"matematika": 5, "fizika": 4},  "Bekzod": {"matematika": 3, "fizika": 4},}for ism, fanlar in jurnal.items():  jami = sum(fanlar.values())  ortacha = jami / len(fanlar)  print(ism, "o'rtacha:", round(ortacha, 2))

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

Bashorat qiling
baholar = {"Aziza": [5, 4, 5]}print(baholar["Aziza"][0])print(len(baholar["Aziza"]))print(len(baholar))
Javobni ko'rish
5
3
1

Birinchisi ichki ro'yxatning birinchi elementi. Ikkinchisi ichki ro'yxat uzunligi (3 baho). Uchinchisi tashqi lug'atda nechta kalit borligi — bitta o'quvchi.

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

Bashorat qiling
oquvchilar = [  {"ism": "Aziza", "baho": 5},  {"ism": "Bekzod", "baho": 3},]jami = 0for o in oquvchilar:  jami = jami + o["baho"]print(jami)
Javobni ko'rish
8

Yig'indi naqshi, faqat element son emas, lug'at. Har lug'atdan «baho» kaliti olinib qo'shildi: 5 + 3 = 8.

Bitta sondan boshlab, sinf jurnalini bosqichma-bosqich yig’ing. Har bosqichda tuzilmaning chegarasi ko’rsatiladi — keyingi qavat aynan shu chegarani ochadi.

Ma'lumot quruvchi

Sinf jurnalini bosqichma-bosqich yig'ing: har bosqich oldingisining chegarasini ochadi.

Bu simulyator sinf jurnalini besh bosqichda yig'adi: bitta sondan boshlanib, lug'at ichidagi lug'atgacha. Har bosqichda tuzilma qanday savolga javob berishi va qanday chegarasi borligi yoziladi.

JavaScript'siz sinash: daftargajurnal = {"Aziza": {"matematika": 5}}deb yozing va jurnal["Aziza"]["matematika"] murojaatini qavat-qavat oching: avval tashqi lug'atdan «Aziza» olinadi, natija — lug'at; keyin undan «matematika» olinadi, natija — 5.

  1. Bitta qiymat
  2. Ro'yxat
  3. Lug'at
  4. Lug'at ichida ro'yxat
  5. Lug'at ichida lug'at

Qanday savolga javob beradi

Murojaat

Chegarasi

Bu kod ataylab buzuq — xatoni toping

Buzuq kod
jurnal = {"Aziza": {"matematika": 5}}print(jurnal["Aziza"]["fizika"])

Python shunday javob beradi:

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

Birinchi qavat topildi — jurnal[«Aziza»] ishladi. Xato ikkinchi qavatda: ichki lug'atda «fizika» kaliti yo'q.

Traceback qaysi kalit yo’qligini aytadi, lekin qaysi qavatda ekanini aytmaydi. Shu sababli uzun murojaatni tekshirganda uni bo’laklab ko’ring: ichki = jurnal["Aziza"], keyin print(ichki). Xato qavatini bir zumda topasiz.

1jurnal['Aziza']['fizika'] murojaati qanday tartibda bajariladi?

Javobni ko'rish

Chapdan o’ngga: avval jurnal[“Aziza”] bajarilib ichki lug’at olinadi, keyin o’sha lug’atdan “fizika” kaliti olinadi.

2Har o'quvchining bir nechta bahosini saqlash uchun qanday tuzilma kerak?

Javobni ko'rish

Lug’at ichida ro’yxat: {"Aziza": [5, 4, 5]}. Kalit — ism, qiymat — baholar ro’yxati.

3len(baholar) va len(baholar['Aziza']) nimani beradi?

Javobni ko'rish

Birinchisi tashqi lug’atdagi kalitlar sonini (nechta o’quvchi), ikkinchisi Azizaning baholari sonini.

4Uzun murojaatdagi xatoni qanday tez topasiz?

Javobni ko'rish

Murojaatni bo’laklab, oraliq natijalarni alohida o’zgaruvchiga yozib print qilish kerak — qaysi qavatda uzilganini darhol ko’rsatadi.

5Ro'yxat ichida lug'at qanday holatda qulayroq?

Javobni ko'rish

Bir turdagi yozuvlar ko’p bo’lganda — jadval shaklidagi ma’lumot uchun. CSV fayldan o’qilgan ma’lumot aynan shu shaklda bo’ladi.

Topshiriq — darajangizni tanlang

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

Uch sinfdoshingiz uchun lug’at tuzing: kalit — ism, qiymat — uchta bahodan iborat ro’yxat. Keyin har birining birinchi bahosini, oxirgi bahosini va baholari sonini chiqaring. Bittasiga yangi baho qo’shing (append) va natijani qayta chiqaring.

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

Sinf jurnalini «lug’at ichida lug’at» shaklida tuzing (kamida 4 o’quvchi, 3 fan). Programma chiqarsin: har o’quvchining o’rtacha bahosi, har fanning sinf bo’yicha o’rtachasi va eng yuqori o’rtachaga ega o’quvchi ismi. Hisobot f-string bilan tekislangan holda chiqsin.

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

Maktab bazasini uch qavatda modellashtiring: sinf → o’quvchilar → fanlar → baholar. Keyin uch savolga javob beruvchi kod yozing: (1) qaysi sinfning umumiy o’rtachasi eng yuqori, (2) qaysi fan bo’yicha eng ko’p ikki bor, (3) barcha sinflarda 5 olgan o’quvchilar ro’yxati. Chegara holatlarini hisobga oling: bahosi yo’q o’quvchi, o’quvchisi yo’q sinf. Har savol uchun necha qavat aylanish kerak bo’lganini yozib qo’ying.

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