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:

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}")
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?

  1. "b"
  2. 2
  3. 1
  4. Xato beradi

To'g'ri. Kalit bo'yicha unga mos qiymat olinadi.

Lug'atda yo'q kalitni xatosiz so'rash uchun nima ishlatiladi?

  1. d.find("x")
  2. d["x"]
  3. d.index("x")
  4. 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?

  1. {"x": 5}
  2. {"x": 1, "x": 5}
  3. {"x": 6}
  4. 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?

  1. keys()
  2. values()
  3. items()
  4. 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 KeyError beradi; in bilan tekshiring yoki get() 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.