Lug'at (dict)
Bu bobda
- kalit → qiymat juftliklarini saqlashni
- qiymatni olish, qo'shish, o'zgartirish va o'chirishni
KeyErrordanget()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.
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))
+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:
talaba = {"ism": "Sarvinoz", "yosh": 19, "shahar": "Buxoro", "kurs": 2} print(f"{talaba['ism']} {talaba['shahar']}dan, {talaba['kurs']}-kurs")
Sarvinoz Buxorodan, 2-kurs
f-string tashqi qo'shtirnog'i " bo'lgani uchun kalitni ' bilan yozdik.
Qo'shish, o'zgartirish, o'chirish
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)
{'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()
telefon = {"Ali": "+998 90 123 45 67"} print(telefon["Vali"])
KeyError: 'Vali'
get() kalit bo'lmasa xato bermaydi, None yoki siz bergan standart qiymatni qaytaradi:
telefon = {"Ali": "+998 90 123 45 67"} print(telefon.get("Vali")) print(telefon.get("Vali", "Topilmadi")) print("Vali" in telefon)
None Topilmadi False
in lug'atda kalitlar orasidan qidiradi.
Lug'at bo'ylab yurish
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")
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 |
narxlar = {"non": 4000, "sut": 12500, "guruch": 21000} print("Jami:", sum(narxlar.values())) print("Eng qimmat:", max(narxlar, key=narxlar.get))
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:
gap = "olma anor olma behi anor olma" sanoq = {} for soz in gap.split(): sanoq[soz] = sanoq.get(soz, 0) + 1 print(sanoq)
{'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:
sanoq = {"olma": 3, "anor": 2, "behi": 1, "nok": 4} for soz in sorted(sanoq, key=sanoq.get, reverse=True): print(soz, sanoq[soz])
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:
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)
Ali 78 Toshkent Sarvinoz 91 Buxoro Otabek 85 Toshkent Toshkentdan: 2
Qiymati ro'yxat bo'lgan lug'at:
kurslar = { "Python": ["Ali", "Otabek"], "SQL": ["Sarvinoz"], } kurslar["Python"].append("Javohir") for kurs, royxat in kurslar.items(): print(f"{kurs}: {', '.join(royxat)} ({len(royxat)} kishi)")
Python: Ali, Otabek, Javohir (3 kishi) SQL: Sarvinoz (1 kishi)
Lug'at ichida lug'at:
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']}")
@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
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)
{'Ali': 78, 'Vali': 91, 'Sarvinoz': 85}
{'Otabek': 70, 'Ali': 78, 'Vali': 91, 'Sarvinoz': 85}Ro'yxat kalit bo'la olmaydi
d = {} d[[1, 2]] = "nuqta"
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
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.
| Kirish | Kutilgan natija |
|---|---|
| anor, 2 | 50000 |
| uzum, 1 | 30000 |
| banan, 3 | Bunday meva yo'q |
Yechimni ko'rish
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")
Gap berilgan. Eng ko'p uchragan so'zni chiqaring. Bir nechta bo'lsa — gapda birinchi uchraganini.
| Kirish | Kutilgan natija |
|---|---|
| olma anor olma behi anor olma | olma |
| a b b a | a |
| salom | salom |
Yechimni ko'rish
sanoq = {} for s in input().split(): sanoq[s] = sanoq.get(s, 0) + 1 print(max(sanoq, key=sanoq.get))
So'z berilgan. Undagi har bir harf necha marta uchrashini, harflar birinchi uchragan tartibda, harf son ko'rinishida alohida qatorlarda chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| banana | b 1 a 3 n 2 |
| olma | o 1 l 1 m 1 a 1 |
Yechimni ko'rish
sanoq = {} for h in input(): sanoq[h] = sanoq.get(h, 0) + 1 for h, n in sanoq.items(): print(h, n)
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.
| Kirish | Kutilgan natija |
|---|---|
| men kitob o'qiyman | I book read |
| sen yaxshi | you good |
| men Python o'qiyman | I Python read |
Yechimni ko'rish
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))
Birinchi qatorda talabalar soni N, keyingi N qatorda ism ball berilgan. Eng yuqori ball olgan talabaning ismini chiqaring (bir nechta bo'lsa — birinchisi).
| Kirish | Kutilgan natija |
|---|---|
| 3, Ali 78, Sarvinoz 91, Otabek 85 | Sarvinoz |
| 2, Vali 60, Ali 60 | Vali |
Yechimni ko'rish
n = int(input()) jurnal = {} for _ in range(n): ism, ball = input().split() jurnal[ism] = int(ball) print(max(jurnal, key=jurnal.get))
Birinchi qatorda N, keyingi N qatorda ism shahar berilgan. Har bir shahardan nechta talaba borligini, shaharlarni alifbo tartibida, shahar son ko'rinishida chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 4, Ali Toshkent, Vali Buxoro, Sarvinoz Buxoro, Otabek Andijon | Andijon 1 Buxoro 2 Toshkent 1 |
| 2, A Xiva, B Xiva | Xiva 2 |
Yechimni ko'rish
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.