Lug'atlar (dict)
Ro'yxatda elementni tartib raqami bo'yicha topamiz. Lekin hayotda ko'pincha nom bo'yicha qidiramiz: telefon daftarida — ism bo'yicha, lug'atda — so'z bo'yicha. Python'da buning uchun lug'atlar bor.
Bu darsda
- Kalit va qiymat tushunchasi
- Lug'at yaratish va qiymatni kalit bo'yicha olish
- Qo'shish, o'zgartirish va o'chirish
get()— xatosiz qidirish- Lug'at bo'ylab sikl:
keys(),values(),items() - Sanash masalalari va lug'atlar ro'yxati
Kalit va qiymat
Telefon daftarini oching: har bir qatorda ism va unga mos raqam bor. Raqamni topish uchun daftarni boshidan varaqlamaysiz — shunchaki ismni qidirasiz. Ism — kalit, raqam — qiymat.
Lug'at (inglizcha dictionary, Python'da dict) — kalit: qiymat juftliklari to'plami. U figurali qavslar ichida yoziladi, kalit va qiymat ikki nuqta bilan ajratiladi:
telefonlar = {
"Aziz": "+998 90 123 45 67",
"Dilnoza": "+998 91 765 43 21",
"Sardor": "+998 93 555 00 11",
}
print(telefonlar["Dilnoza"])
print(len(telefonlar))
+998 91 765 43 21 3
Qiymat indeks bilan emas, kalit bilan olinadi: telefonlar["Dilnoza"]. Kalitlar odatda satr bo'ladi, lekin son yoki kortej ham bo'lishi mumkin. Qiymat esa istalgan narsa: son, satr, ro'yxat, hatto boshqa lug'at.
Bir narsa haqida ma'lumot
Lug'atlar biror narsaning xususiyatlarini saqlash uchun juda qulay:
talaba = {
"ism": "Malika",
"yosh": 19,
"fakultet": "Axborot texnologiyalari",
"baholar": [5, 4, 5],
}
print(talaba["ism"], "—", talaba["fakultet"])
print("O'rtacha baho:", sum(talaba["baholar"]) / len(talaba["baholar"]))
Qo'shish, o'zgartirish, o'chirish
Yangi juftlik qo'shish va mavjud qiymatni o'zgartirish bir xil yoziladi. Kalit bo'lsa — qiymati yangilanadi, bo'lmasa — yangi juftlik qo'shiladi:
talaba = {"ism": "Malika", "yosh": 19}
talaba["kurs"] = 2 # yangi kalit — qo'shiladi
talaba["yosh"] = 20 # mavjud kalit — yangilanadi
print(talaba)
del talaba["kurs"] # o'chirish
print(talaba)
{'ism': 'Malika', 'yosh': 20, 'kurs': 2}
{'ism': 'Malika', 'yosh': 20}
Lug'atda bitta kalit faqat bir marta uchraydi. Shuning uchun talaba["yosh"] = 20 yangi juftlik qo'shmadi, balki mavjud qiymatni almashtirdi.
Mavjud bo'lmagan kalit
Lug'atda yo'q kalitni so'rasangiz, KeyError chiqadi:
narxlar = {"non": 4000, "sut": 12000}
print(narxlar["qatiq"])
Bundan qochishning ikki yo'li bor:
inbilan avval tekshirish:if "qatiq" in narxlar:—inlug'atda kalitlarni tekshiradi.get()metodi: kalit bo'lmasa, xato o'rnigaNoneyoki siz bergan standart qiymatni qaytaradi.
narxlar = {"non": 4000, "sut": 12000}
print(narxlar.get("non"))
print(narxlar.get("qatiq"))
print(narxlar.get("qatiq", "narxi noma'lum"))
if "sut" in narxlar:
print("Sut bor:", narxlar["sut"], "so'm")
4000 None narxi noma'lum Sut bor: 12000 so'm
None — Python'dagi maxsus qiymat, «hech narsa», «qiymat yo'q» degani.
Lug'at bo'ylab sikl
Lug'at bo'ylab for sikli kalitlar bo'yicha yuradi. Kalit va qiymat birga kerak bo'lsa, items() metodi ishlatiladi:
poytaxtlar = {
"O'zbekiston": "Toshkent",
"Qozog'iston": "Astana",
"Qirg'iziston": "Bishkek",
"Tojikiston": "Dushanbe",
"Turkmaniston": "Ashxobod",
}
for davlat in poytaxtlar:
print(davlat)
print()
for davlat, poytaxt in poytaxtlar.items():
print(f"{davlat} poytaxti — {poytaxt}")
keys()— barcha kalitlar,values()— barcha qiymatlar,items()—(kalit, qiymat)juftliklari (kortejlar!).
ballar = {"Aziz": 87, "Dilnoza": 95, "Sardor": 72}
print(list(ballar.keys()))
print(list(ballar.values()))
print("Eng yuqori ball:", max(ballar.values()))
Python lug'atdagi juftliklarni ular qo'shilgan tartibda saqlaydi. Shuning uchun sikl doim birinchi qo'shilgan kalitdan boshlanadi.
Sanash masalalari
Lug'atlarning eng mashhur qo'llanishlaridan biri — nimadir necha marta uchraganini sanash. Masalan, ovoz berish natijalari:
ovozlar = ["palov", "manti", "palov", "lag'mon", "palov", "manti", "somsa"]
hisob = {}
for taom in ovozlar:
if taom in hisob:
hisob[taom] += 1
else:
hisob[taom] = 1
for taom, soni in hisob.items():
print(f"{taom}: {soni} ta ovoz")
palov: 3 ta ovoz manti: 2 ta ovoz lag'mon: 1 ta ovoz somsa: 1 ta ovoz
if/else ni get() bilan bitta qatorga qisqartirish mumkin: hisob[taom] = hisob.get(taom, 0) + 1 — «hozirgi soni (yo'q bo'lsa 0) ga bitta qo'sh».
Lug'atlar ro'yxati
Haqiqiy dasturlarda ko'pincha bir xil tuzilishdagi ko'p narsalar bo'ladi: o'quvchilar, mahsulotlar, buyurtmalar. Ular lug'atlar ro'yxati ko'rinishida saqlanadi:
mahsulotlar = [
{"nomi": "Non", "narx": 4000, "soni": 2},
{"nomi": "Sut", "narx": 12000, "soni": 1},
{"nomi": "Olma", "narx": 15000, "soni": 3},
]
jami = 0
for m in mahsulotlar:
summa = m["narx"] * m["soni"]
jami += summa
print(f"{m['nomi']:<6} {m['soni']} x {m['narx']} = {summa}")
print("Jami:", jami, "so'm")
Non 2 x 4000 = 8000 Sut 1 x 12000 = 12000 Olma 3 x 15000 = 45000 Jami: 65000 so'm
f-satrdagi :<6 matnni 6 belgilik joyga chapdan tekislaydi — ustunlar chiroyli bo'lishi uchun. Yana bir narsaga e'tibor bering: f-satr ikkita qo'shtirnoq ichida bo'lgani uchun, ichidagi kalitlar bittalik qo'shtirnoqda yozildi: m['nomi'].
Amaliy misol: kichik tarjimon
lugat = {
"apple": "olma",
"book": "kitob",
"water": "suv",
"friend": "do'st",
"computer": "kompyuter",
}
for _ in range(3):
soz = input("Inglizcha so'z: ").strip().lower()
tarjima = lugat.get(soz, "bu so'z lug'atda yo'q")
print(f" → {tarjima}")
Mashqlar
1-mashq Viloyat markazlari
Lug'atdagi har bir viloyat uchun Xorazm viloyati markazi — Urganch ko'rinishidagi qatorni chiqaring.
markazlar = {
"Xorazm": "Urganch",
"Qashqadaryo": "Qarshi",
"Surxondaryo": "Termiz",
"Sirdaryo": "Guliston",
}
Yechimni ko'rish
markazlar = {
"Xorazm": "Urganch",
"Qashqadaryo": "Qarshi",
"Surxondaryo": "Termiz",
"Sirdaryo": "Guliston",
}
for viloyat, markaz in markazlar.items():
print(f"{viloyat} viloyati markazi — {markaz}")
2-mashq Harflar chastotasi
So'zdagi har bir harf necha marta uchrashini sanang va harflar so'zda birinchi uchragan tartibda chiqaring.
a: 3 n: 2 s: 1
soz = "ananas"
Yechimni ko'rish
soz = "ananas"
hisob = {}
for harf in soz:
hisob[harf] = hisob.get(harf, 0) + 1
for harf, soni in hisob.items():
print(f"{harf}: {soni}")
3-mashq Savat
narxlar lug'atida mahsulot narxlari, savat lug'atida esa har bir mahsulotdan nechta olingani bor. Umumiy summani hisoblang.
narxlar = {"non": 4000, "sut": 12000, "tuxum": 1500}
savat = {"non": 2, "sut": 1, "tuxum": 10}
Yechimni ko'rish
narxlar = {"non": 4000, "sut": 12000, "tuxum": 1500}
savat = {"non": 2, "sut": 1, "tuxum": 10}
jami = 0
for mahsulot, soni in savat.items():
jami += narxlar[mahsulot] * soni
print("Jami:", jami, "so'm")
4-mashq Eng yaxshi natija
O'quvchilar ro'yxatidan eng yuqori ball olgan o'quvchining ismini va ballini chiqaring.
oquvchilar = [
{"ism": "Aziz", "ball": 87},
{"ism": "Dilnoza", "ball": 95},
{"ism": "Sardor", "ball": 72},
{"ism": "Kamola", "ball": 91},
]
Yechimni ko'rish
oquvchilar = [
{"ism": "Aziz", "ball": 87},
{"ism": "Dilnoza", "ball": 95},
{"ism": "Sardor", "ball": 72},
{"ism": "Kamola", "ball": 91},
]
eng_yaxshi = oquvchilar[0]
for o in oquvchilar:
if o["ball"] > eng_yaxshi["ball"]:
eng_yaxshi = o
print(eng_yaxshi["ism"], eng_yaxshi["ball"])
O'zingizni sinang
d = {"a": 1, "b": 2} bo'lsa, d["b"] nimaga teng?
"b"21- Xato beradi
To'g'ri. Kalit bo'yicha unga mos qiymat olinadi.
Lug'atda yo'q kalitni xatosiz so'rash uchun nima ishlatiladi?
d.find("x")d["x"]d.index("x")d.get("x")
To'g'ri. get() kalit bo'lmasa None (yoki siz bergan qiymatni) qaytaradi.
d = {"x": 1}; d["x"] = 5 qatoridan keyin d nimaga teng?
{"x": 5}{"x": 1, "x": 5}{"x": 6}- Xato beradi
To'g'ri. Kalitlar takrorlanmaydi: mavjud kalitning qiymati yangilanadi.
Lug'at bo'ylab sikl ichida kalit va qiymatni birga olish uchun qaysi metod kerak?
keys()values()items()pairs()
To'g'ri: for kalit, qiymat in d.items():
Xulosa
- Lug'at —
{kalit: qiymat}juftliklari. Qiymat kalit bo'yicha olinadi:d["kalit"]. d["yangi"] = qiymat— qo'shadi yoki yangilaydi;del d["kalit"]— o'chiradi.- Yo'q kalit
KeyErrorberadi;inbilan tekshiring yokiget()ishlating. for k, v in d.items():— kalit va qiymat bo'ylab yurish.- Sanash uchun:
hisob[x] = hisob.get(x, 0) + 1. - Bir xil tuzilishdagi ko'p narsalar lug'atlar ro'yxatida saqlanadi.