8-bo‘lim
Lug'atlar va to'plamlar
Kalit-qiymat juftliklari bilan ishlash (dict), takrorlanmaydigan elementlar to'plami (set) va ular ustidagi amallar.
Ushbu bo‘lim mundarijasi
Ro'yxatda elementga raqam orqali murojaat qilasiz: talabalar[2]. Lekin ko'pincha ma'noli nom orqali murojaat qilish qulayroq: talaba["ism"]. Aynan shu ish uchun lug'at kerak.
Lug'at (dict) #
Lug'at - {kalit: qiymat} ko'rinishidagi juftliklar to'plami.
talaba = {
"ism": "Husanboy",
"yosh": 25,
"shahar": "Namangan",
"talabami": True,
}
print(talaba)
print(talaba["ism"])
print(len(talaba))
{'ism': 'Husanboy', 'yosh': 25, 'shahar': 'Namangan', 'talabami': True}
Husanboy
4
Qiymat olish #
talaba = {"ism": "Husanboy", "yosh": 25}
print(talaba["ism"]) # to'g'ridan-to'g'ri
print(talaba.get("yosh")) # xavfsiz usul
print(talaba.get("telefon")) # yo'q kalit -> None
print(talaba.get("telefon", "kiritilmagan")) # standart qiymat bilan
Husanboy
25
None
kiritilmagan
[] va .get() farqiprint(talaba["telefon"])
KeyError: 'telefon'
Kalit borligiga ishonchingiz komil bo'lmasa, har doim .get() ishlating - u xato o'rniga None qaytaradi.
Qo'shish va o'zgartirish #
talaba = {"ism": "Husanboy", "yosh": 25}
talaba["shahar"] = "Namangan" # yangi kalit qo'shish
talaba["yosh"] = 26 # mavjudini o'zgartirish
print(talaba)
talaba.update({"telefon": "+998901234567", "kurs": 3})
print(talaba)
{'ism': 'Husanboy', 'yosh': 26, 'shahar': 'Namangan'}
{'ism': 'Husanboy', 'yosh': 26, 'shahar': 'Namangan', 'telefon': '+998901234567', 'kurs': 3}
O'chirish #
talaba = {"ism": "Husanboy", "yosh": 26, "kurs": 3, "telefon": "+998901234567"}
del talaba["telefon"]
print(talaba)
olingan = talaba.pop("kurs")
print(f"O'chirilgan qiymat: {olingan}")
talaba.clear()
print(talaba)
{'ism': 'Husanboy', 'yosh': 26, 'kurs': 3}
O'chirilgan qiymat: 3
{}
Lug'at bo'ylab yurish #
narxlar = {
"Klaviatura": 185000,
"Sichqoncha": 95000,
"Monitor": 2450000,
}
# Faqat kalitlar
for mahsulot in narxlar:
print(mahsulot)
print("---")
# Kalit va qiymat birga
for mahsulot, narx in narxlar.items():
print(f"{mahsulot:<15}{narx:>10,} so'm")
print("---")
# Faqat qiymatlar
print("Jami:", sum(narxlar.values()), "so'm")
Klaviatura
Sichqoncha
Monitor
---
Klaviatura 185,000 so'm
Sichqoncha 95,000 so'm
Monitor 2,450,000 so'm
---
Jami: 2730000 so'm
| Metod | Qaytaradi |
|---|---|
.keys() | Barcha kalitlar |
.values() | Barcha qiymatlar |
.items() | (kalit, qiymat) juftliklari |
.get(k, d) | Qiymat yoki standart |
.pop(k) | Qiymatni o'chirib qaytaradi |
.update(d) | Boshqa lug'at bilan birlashtiradi |
.setdefault(k, d) | Kalit yo'q bo'lsa yaratadi |
.copy() | Nusxa |
Ichma-ich lug'atlar #
Real ma'lumotlar odatda shunday tuzilishga ega:
guruh = {
"husanboy": {
"toliq_ism": "Husanboy Qodirov",
"baholar": [85, 92, 78],
"shahar": "Namangan",
},
"sardor": {
"toliq_ism": "Sardor Aliyev",
"baholar": [70, 65, 80],
"shahar": "Toshkent",
},
}
print(guruh["husanboy"]["toliq_ism"])
print(guruh["sardor"]["baholar"][0])
for login, malumot in guruh.items():
ortacha = sum(malumot["baholar"]) / len(malumot["baholar"])
print(f"{malumot['toliq_ism']:<20}{ortacha:>6.1f} ({malumot['shahar']})")
Husanboy Qodirov
70
Husanboy Qodirov 85.0 (Namangan)
Sardor Aliyev 71.7 (Toshkent)
Lug'at tuzilishi JSON formatiga deyarli aynan mos keladi. Shuning uchun API bilan ishlaganda kelgan ma'lumot avtomatik ravishda lug'atga aylanadi. Buni 13-bo'limda ko'ramiz.
Lug'at generatorlari #
sonlar = [1, 2, 3, 4, 5]
kvadratlar = {son: son ** 2 for son in sonlar}
print(kvadratlar)
narxlar = {"olma": 12000, "anor": 25000, "uzum": 18000}
chegirma = {mahsulot: narx * 0.9 for mahsulot, narx in narxlar.items()}
print(chegirma)
qimmatlar = {m: n for m, n in narxlar.items() if n > 15000}
print(qimmatlar)
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
{'olma': 10800.0, 'anor': 22500.0, 'uzum': 16200.0}
{'anor': 25000, 'uzum': 18000}
To'plam (set) #
To'plam - takrorlanmaydigan va tartibsiz elementlar guruhi.
raqamlar = {3, 1, 4, 1, 5, 9, 2, 6, 5}
print(raqamlar) # takrorlar avtomatik olib tashlandi
bosh_toplam = set() # {} emas! -- u lug'at yaratadi
print(type(bosh_toplam))
# Ro'yxatdan takrorlarni olib tashlash
shaharlar = ["Toshkent", "Buxoro", "Toshkent", "Xiva", "Buxoro"]
noyob = list(set(shaharlar))
print(noyob)
{1, 2, 3, 4, 5, 6, 9}
<class 'set'>
['Toshkent', 'Buxoro', 'Xiva']
To'plam amallari #
python_biladi = {"Husanboy", "Sardor", "Malika"}
java_biladi = {"Sardor", "Bekzod", "Malika"}
print("Ikkalasidan biri:", python_biladi | java_biladi)
print("Ikkalasi ham: ", python_biladi & java_biladi)
print("Faqat Python: ", python_biladi - java_biladi)
print("Faqat bittasi: ", python_biladi ^ java_biladi)
Ikkalasidan biri: {'Bekzod', 'Malika', 'Sardor', 'Husanboy'}
Ikkalasi ham: {'Malika', 'Sardor'}
Faqat Python: {'Husanboy'}
Faqat bittasi: {'Bekzod', 'Husanboy'}
To'plam metodlari #
kutubxonalar = {"numpy", "pandas"}
kutubxonalar.add("requests") # bitta element qo'shish
kutubxonalar.update(["flask", "django"]) # bir nechta
print(kutubxonalar)
kutubxonalar.discard("flask") # xato bermaydi
kutubxonalar.remove("django") # yo'q bo'lsa KeyError
print(kutubxonalar)
print("numpy" in kutubxonalar)
{'pandas', 'requests', 'numpy', 'flask', 'django'}
{'pandas', 'requests', 'numpy'}
True
Qaysi to'plamni tanlash kerak? #
| Vazifa | Tanlov | Sabab |
|---|---|---|
| Tartiblangan ro'yxat, takror mumkin | list | Indeks bo'yicha murojaat |
| O'zgarmas ma'lumot | tuple | Himoyalangan, tezroq |
| Nom bo'yicha murojaat | dict | Kalit-qiymat |
| Takrorsiz elementlar, tez qidirish | set | in amali juda tez |
1 000 000 ta elementdan bittasini qidirish:
| Tur | Taxminiy vaqt |
|---|---|
list | ~15 millisekund |
set | ~0.00005 millisekund |
Sabab: ro'yxatda Python har bir elementni ketma-ket tekshiradi, to'plamda esa xesh-jadval orqali darhol topadi. Agar in amalini ko'p ishlatsangiz - set ga o'ting.
Amaliy misol: so'zlar chastotasi #
# ============================================
# Matndagi so'zlar chastotasini hisoblash
# ============================================
matn = """Python o'rganish oson. Python kuchli til.
Ko'plab kompaniyalar Python ishlatadi. Python bilan hammasi mumkin."""
# Tozalash va bo'lish
sozlar = matn.lower().replace(".", "").replace(",", "").split()
# Chastotani hisoblash
chastota = {}
for soz in sozlar:
chastota[soz] = chastota.get(soz, 0) + 1
# Kamayish tartibida saralash
saralangan = sorted(chastota.items(), key=lambda juftlik: juftlik[1], reverse=True)
print("=" * 38)
print(f"{'SO‘ZLAR CHASTOTASI':^38}")
print("=" * 38)
for soz, soni in saralangan[:6]:
ustun = "#" * soni
print(f"{soz:<16}{soni:>3} {ustun}")
print("=" * 38)
print(f"Jami so'zlar: {len(sozlar)}")
print(f"Noyob so'zlar: {len(set(sozlar))}")
print(f"Takrorlanish darajasi: {(1 - len(set(sozlar)) / len(sozlar)):.0%}")
======================================
SO'ZLAR CHASTOTASI
======================================
python 4 ####
o'rganish 1 #
oson 1 #
kuchli 1 #
til 1 #
ko'plab 1 #
======================================
Jami so'zlar: 14
Noyob so'zlar: 11
Takrorlanish darajasi: 21%
telefon_kitobi.py dasturini yozing:
- Bo'sh lug'at yarating.
- Foydalanuvchidan 3 ta ism va telefon raqamini so'rab, lug'atga qo'shing.
- Butun kitobni chiroyli jadval ko'rinishida chiqaring.
- Foydalanuvchidan ism so'rab,
.get()bilan raqamini toping (topilmasa "Topilmadi" deb yozing). setyordamida nechta noyob operator kodi (raqamning+998dan keyingi 2 ta raqami) borligini aniqlang.
Xulosa #
dict- kalit orqali qiymatga tez murojaat qilish uchun;.get()xavfsizroq..items()kalit va qiymatni birga aylanib chiqish imkonini beradi.- Lug'at generatorlari
{k: v for ...}ko'rinishida yoziladi. settakrorlanmaydigan elementlarni saqlaydi vainamalini juda tez bajaradi.- To'plamlar ustida
|,&,-,^amallari mavjud.
Keyingi bo'limda dasturga qaror qabul qilishni o'rgatamiz - shart operatorlari.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.