Asosiy qismga o'tish

Lug'at (dict)

11-bob 20 kod bloki 1859 so'z

Bu bobda

  • kalit → qiymat juftliklarini saqlashni
  • qiymatni olish, qo'shish, o'zgartirish va o'chirishni
  • KeyError dan get() bilan qochishni
  • lug'at bo'ylab items() bilan yurishni
  • sanash andozasini va ichma-ich ma'lumotni

Lug'at nima?

Telefon kitobchasini eslang: ism bo'yicha raqam topasiz, tartib raqami bo'yicha emas. Lug'at (dictionary) aynan shunday: har bir qiymat (value) o'zining kaliti (key) orqali olinadi.

python8 qator
telefon = {
    "Ali": "+998 90 123 45 67",
    "Sarvinoz": "+998 93 555 00 11",
    "Otabek": "+998 97 700 70 70",
}
print(telefon["Sarvinoz"])
print(len(telefon))
print(type(telefon))
Natija
+998 93 555 00 11
3
<class 'dict'>

Figurali qavs {}, har bir juftlik kalit: qiymat, juftliklar vergul bilan ajratiladi.

Ro'yxat bilan farqi:

Ro'yxat Lug'at
Qanday olinadi indeks bilan: r[0] kalit bilan: d["Ali"]
Nimani bildiradi tartiblangan qator nom → ma'lumot
Qachon bir xil narsalar ketma-ketligi bitta narsaning xususiyatlari, qidiruv jadvali

Bitta talabaning ma'lumotlari — lug'at uchun klassik misol:

python2 qator
talaba = {"ism": "Sarvinoz", "yosh": 19, "shahar": "Buxoro", "kurs": 2}
print(f"{talaba['ism']} {talaba['shahar']}dan, {talaba['kurs']}-kurs")
Natija
Sarvinoz Buxorodan, 2-kurs

f-string tashqi qo'shtirnog'i " bo'lgani uchun kalitni ' bilan yozdik.

Qo'shish, o'zgartirish, o'chirish

python9 qator
talaba = {"ism": "Ali", "yosh": 20}
talaba["shahar"] = "Toshkent"
print(talaba)
talaba["yosh"] = 21
print(talaba)
del talaba["shahar"]
print(talaba)
yosh = talaba.pop("yosh")
print(yosh, talaba)
Natija
{'ism': 'Ali', 'yosh': 20, 'shahar': 'Toshkent'}
{'ism': 'Ali', 'yosh': 21, 'shahar': 'Toshkent'}
{'ism': 'Ali', 'yosh': 21}
21 {'ism': 'Ali'}

Kalit yo'q bo'lsa — d[kalit] = qiymat qo'shadi, bor bo'lsa — almashtiradi. Bitta lug'atda bir xil kalit ikki marta bo'lmaydi.

KeyError va get()

python2 qator
telefon = {"Ali": "+998 90 123 45 67"}
print(telefon["Vali"])
Xato xabari
KeyError: 'Vali'

get() kalit bo'lmasa xato bermaydi, None yoki siz bergan standart qiymatni qaytaradi:

python4 qator
telefon = {"Ali": "+998 90 123 45 67"}
print(telefon.get("Vali"))
print(telefon.get("Vali", "Topilmadi"))
print("Vali" in telefon)
Natija
None
Topilmadi
False

in lug'atda kalitlar orasidan qidiradi.

Lug'at bo'ylab yurish

python9 qator
narxlar = {"non": 4000, "sut": 12500, "guruch": 21000}
for mahsulot in narxlar:
    print(mahsulot)
print("---")
for narx in narxlar.values():
    print(narx)
print("---")
for mahsulot, narx in narxlar.items():
    print(f"{mahsulot:<8}{narx:>8,} so'm")
Natija
non
sut
guruch
---
4000
12500
21000
---
non        4,000 so'm
sut       12,500 so'm
guruch    21,000 so'm
Yozuv Har aylanishda nima keladi
for k in d yoki d.keys() kalit
for v in d.values() qiymat
for k, v in d.items() (kalit, qiymat) korteji — darhol ochamiz
python3 qator
narxlar = {"non": 4000, "sut": 12500, "guruch": 21000}
print("Jami:", sum(narxlar.values()))
print("Eng qimmat:", max(narxlar, key=narxlar.get))
Natija
Jami: 37500
Eng qimmat: guruch

max(narxlar, key=narxlar.get) — "kalitlar ichidan, qiymati eng katta bo'lganini top".

Sanash andozasi

Lug'atning eng mashhur ishlatilishi — nimadir necha marta uchrashini sanash:

python5 qator
gap = "olma anor olma behi anor olma"
sanoq = {}
for soz in gap.split():
    sanoq[soz] = sanoq.get(soz, 0) + 1
print(sanoq)
Natija
{'olma': 3, 'anor': 2, 'behi': 1}

sanoq.get(soz, 0) — so'z hali bo'lmasa 0, bo'lsa — hozirgi soni. Keyin 1 qo'shib, qaytadan yozamiz.

Qiymat bo'yicha kamayish tartibida chiqarish:

python3 qator
sanoq = {"olma": 3, "anor": 2, "behi": 1, "nok": 4}
for soz in sorted(sanoq, key=sanoq.get, reverse=True):
    print(soz, sanoq[soz])
Natija
nok 4
olma 3
anor 2
behi 1

Ichma-ich ma'lumot

Haqiqiy ma'lumot ko'pincha lug'atlar ro'yxati yoki ro'yxatli lug'at bo'ladi.

Lug'atlar ro'yxati — jadvalning har bir qatori lug'at:

python12 qator
talabalar = [
    {"ism": "Ali", "ball": 78, "shahar": "Toshkent"},
    {"ism": "Sarvinoz", "ball": 91, "shahar": "Buxoro"},
    {"ism": "Otabek", "ball": 85, "shahar": "Toshkent"},
]
for t in talabalar:
    print(f"{t['ism']:<10}{t['ball']:>4}  {t['shahar']}")
toshkentliklar = 0
for t in talabalar:
    if t["shahar"] == "Toshkent":
        toshkentliklar += 1
print("Toshkentdan:", toshkentliklar)
Natija
Ali         78  Toshkent
Sarvinoz    91  Buxoro
Otabek      85  Toshkent
Toshkentdan: 2

Qiymati ro'yxat bo'lgan lug'at:

python7 qator
kurslar = {
    "Python": ["Ali", "Otabek"],
    "SQL": ["Sarvinoz"],
}
kurslar["Python"].append("Javohir")
for kurs, royxat in kurslar.items():
    print(f"{kurs}: {', '.join(royxat)} ({len(royxat)} kishi)")
Natija
Python: Ali, Otabek, Javohir (3 kishi)
SQL: Sarvinoz (1 kishi)

Lug'at ichida lug'at:

python6 qator
foydalanuvchilar = {
    "abulqosim": {"ism": "Abulqosim", "soha": "AI", "shahar": "Toshkent"},
    "sarvinoz": {"ism": "Sarvinoz", "soha": "Data", "shahar": "Buxoro"},
}
for login, info in foydalanuvchilar.items():
    print(f"@{login}: {info['ism']}, {info['soha']}, {info['shahar']}")
Natija
@abulqosim: Abulqosim, AI, Toshkent
@sarvinoz: Sarvinoz, Data, Buxoro

Bu tuzilma JSON ga juda o'xshaydi — 21-bobda aynan shunday ma'lumotni faylga saqlaymiz.

Lug'at yasashning boshqa yo'llari

python8 qator
ismlar = ["Ali", "Vali", "Sarvinoz"]
ballar = [78, 91, 85]
jurnal = dict(zip(ismlar, ballar))
print(jurnal)
yangi = {}
yangi.update({"Otabek": 70})
yangi.update(jurnal)
print(yangi)
Natija
{'Ali': 78, 'Vali': 91, 'Sarvinoz': 85}
{'Otabek': 70, 'Ali': 78, 'Vali': 91, 'Sarvinoz': 85}

Ro'yxat kalit bo'la olmaydi

python2 qator
d = {}
d[[1, 2]] = "nuqta"
Xato xabari
TypeError: unhashable type: 'list'

Kalit o'zgarmas bo'lishi kerak: son, satr, kortej. Ro'yxat o'zgaruvchan, shuning uchun kalit bo'la olmaydi. Koordinata uchun kortej ishlating: d[(1, 2)] = "nuqta".

Kitoblarda

  • Python asoslari: Dictionary (lug'at) 48–55-betlar.
  • Python Crash Course: 6-bob Dictionaries 91–111-betlar (get() 98-bet, Looping Through a Dictionary 99-bet, Nesting 106-bet).

Xulosa

  • {kalit: qiymat}; d[k] — olish, d[k] = v — qo'shish yoki almashtirish, del d[k] / d.pop(k) — o'chirish.
  • Kalit bo'lmasa d[k] → KeyError; d.get(k, standart) xavfsiz.
  • for k, v in d.items(): — eng ko'p ishlatiladigan yurish.
  • Sanash: d[x] = d.get(x, 0) + 1.
  • max(d, key=d.get) — eng katta qiymatli kalit; sorted(d, key=d.get, reverse=True) — qiymat bo'yicha tartib.
  • Kalit o'zgarmas bo'lishi kerak: ro'yxat emas, kortej.

Mashqlar

11.1

Dasturda lug'at bor: {"olma": 15000, "anor": 25000, "behi": 18000, "uzum": 30000} (1 kg narxi). Meva nomi va kilogramm (butun son) berilgan. Jami narxni chiqaring. Meva ro'yxatda bo'lmasa — Bunday meva yo'q.

KirishKutilgan natija
anor, 250000
uzum, 130000
banan, 3Bunday meva yo'q
Yechimni ko'rish
python7 qator
narx = {"olma": 15000, "anor": 25000, "behi": 18000, "uzum": 30000}
meva = input()
kg = int(input())
if meva in narx:
    print(narx[meva] * kg)
else:
    print("Bunday meva yo'q")
11.2

Gap berilgan. Eng ko'p uchragan so'zni chiqaring. Bir nechta bo'lsa — gapda birinchi uchraganini.

KirishKutilgan natija
olma anor olma behi anor olmaolma
a b b aa
salomsalom
Yechimni ko'rish
python4 qator
sanoq = {}
for s in input().split():
    sanoq[s] = sanoq.get(s, 0) + 1
print(max(sanoq, key=sanoq.get))
11.3

So'z berilgan. Undagi har bir harf necha marta uchrashini, harflar birinchi uchragan tartibda, harf son ko'rinishida alohida qatorlarda chiqaring.

KirishKutilgan natija
bananab 1 a 3 n 2
olmao 1 l 1 m 1 a 1
Yechimni ko'rish
python5 qator
sanoq = {}
for h in input():
    sanoq[h] = sanoq.get(h, 0) + 1
for h, n in sanoq.items():
    print(h, n)
11.4

Kichik lug'at bor: men → I, sen → you, kitob → book, o'qiyman → read, yaxshi → good. Gap berilgan. Har bir so'zni tarjima qiling; lug'atda bo'lmagan so'z o'zgarishsiz qoladi. So'zlarni probel bilan chiqaring.

KirishKutilgan natija
men kitob o'qiymanI book read
sen yaxshiyou good
men Python o'qiymanI Python read
Yechimni ko'rish
python5 qator
lugat = {"men": "I", "sen": "you", "kitob": "book", "o'qiyman": "read", "yaxshi": "good"}
natija = []
for s in input().split():
    natija.append(lugat.get(s, s))
print(" ".join(natija))
11.5

Birinchi qatorda talabalar soni N, keyingi N qatorda ism ball berilgan. Eng yuqori ball olgan talabaning ismini chiqaring (bir nechta bo'lsa — birinchisi).

KirishKutilgan natija
3, Ali 78, Sarvinoz 91, Otabek 85Sarvinoz
2, Vali 60, Ali 60Vali
Yechimni ko'rish
python6 qator
n = int(input())
jurnal = {}
for _ in range(n):
    ism, ball = input().split()
    jurnal[ism] = int(ball)
print(max(jurnal, key=jurnal.get))
11.6

Birinchi qatorda N, keyingi N qatorda ism shahar berilgan. Har bir shahardan nechta talaba borligini, shaharlarni alifbo tartibida, shahar son ko'rinishida chiqaring.

KirishKutilgan natija
4, Ali Toshkent, Vali Buxoro, Sarvinoz Buxoro, Otabek AndijonAndijon 1 Buxoro 2 Toshkent 1
2, A Xiva, B XivaXiva 2
Yechimni ko'rish
python7 qator
n = int(input())
sanoq = {}
for _ in range(n):
    ism, shahar = input().split()
    sanoq[shahar] = sanoq.get(shahar, 0) + 1
for shahar in sorted(sanoq):
    print(shahar, sanoq[shahar])

Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar