8-bo‘lim

Lug'atlar va to'plamlar

Kalit-qiymat juftliklari bilan ishlash (dict), takrorlanmaydigan elementlar to'plami (set) va ular ustidagi amallar.

🕑 13 daqiqa o‘qish 📄 472 so‘z 👁 6 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Lug'at (dict)
  2. Qiymat olish
  3. Qo'shish va o'zgartirish
  4. O'chirish
  5. Lug'at bo'ylab yurish
  6. Ichma-ich lug'atlar
  7. Lug'at generatorlari
  8. To'plam (set)
  9. To'plam amallari
  10. To'plam metodlari
  11. Qaysi to'plamni tanlash kerak?
  12. Amaliy misol: so'zlar chastotasi
  13. Xulosa

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.

Python
talaba = {
    "ism": "Husanboy",
    "yosh": 25,
    "shahar": "Namangan",
    "talabami": True,
}

print(talaba)
print(talaba["ism"])
print(len(talaba))
Natija
{'ism': 'Husanboy', 'yosh': 25, 'shahar': 'Namangan', 'talabami': True}
Husanboy
4
Kalit (kalit) Qiymat (value) "ism" "Husanboy" "yosh" 22 "shahar" "Samarqand" Kalitlar takrorlanmaydi va o'zgarmas turda bo'lishi kerak (str, int, tuple)
Lug'at har bir kalitga bitta qiymat bog'laydi

Qiymat olish #

Python
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
Natija
Husanboy
25
None
kiritilmagan
[] va .get() farqi
Python
print(talaba["telefon"])
Natija
KeyError: 'telefon'

Kalit borligiga ishonchingiz komil bo'lmasa, har doim .get() ishlating - u xato o'rniga None qaytaradi.

Qo'shish va o'zgartirish #

Python
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)
Natija
{'ism': 'Husanboy', 'yosh': 26, 'shahar': 'Namangan'}
{'ism': 'Husanboy', 'yosh': 26, 'shahar': 'Namangan', 'telefon': '+998901234567', 'kurs': 3}

O'chirish #

Python
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)
Natija
{'ism': 'Husanboy', 'yosh': 26, 'kurs': 3}
O'chirilgan qiymat: 3
{}

Lug'at bo'ylab yurish #

Python
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")
Natija
Klaviatura
Sichqoncha
Monitor
---
Klaviatura        185,000 so'm
Sichqoncha         95,000 so'm
Monitor         2,450,000 so'm
---
Jami: 2730000 so'm
MetodQaytaradi
.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:

Python
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']})")
Natija
Husanboy Qodirov
70
Husanboy Qodirov       85.0  (Namangan)
Sardor Aliyev          71.7  (Toshkent)
JSON bilan bir xil

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 #

Python
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)
Natija
{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.

Python
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)
Natija
{1, 2, 3, 4, 5, 6, 9}
<class 'set'>
['Toshkent', 'Buxoro', 'Xiva']

To'plam amallari #

Birlashma | a | b Kesishma & a & b Ayirma - a - b Simmetrik ^ a ^ b
To'plamlar ustidagi to'rtta asosiy amal
Python
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)
Natija
Ikkalasidan biri: {'Bekzod', 'Malika', 'Sardor', 'Husanboy'}
Ikkalasi ham:     {'Malika', 'Sardor'}
Faqat Python:     {'Husanboy'}
Faqat bittasi:    {'Bekzod', 'Husanboy'}

To'plam metodlari #

Python
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)
Natija
{'pandas', 'requests', 'numpy', 'flask', 'django'}
{'pandas', 'requests', 'numpy'}
True

Qaysi to'plamni tanlash kerak? #

VazifaTanlovSabab
Tartiblangan ro'yxat, takror mumkinlistIndeks bo'yicha murojaat
O'zgarmas ma'lumottupleHimoyalangan, tezroq
Nom bo'yicha murojaatdictKalit-qiymat
Takrorsiz elementlar, tez qidirishsetin amali juda tez
Tezlik farqi juda katta

1 000 000 ta elementdan bittasini qidirish:

TurTaxminiy 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 #

Python
# ============================================
# 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%}")
Natija
======================================
          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%
Amaliy topshiriq

telefon_kitobi.py dasturini yozing:

  1. Bo'sh lug'at yarating.
  2. Foydalanuvchidan 3 ta ism va telefon raqamini so'rab, lug'atga qo'shing.
  3. Butun kitobni chiroyli jadval ko'rinishida chiqaring.
  4. Foydalanuvchidan ism so'rab, .get() bilan raqamini toping (topilmasa "Topilmadi" deb yozing).
  5. set yordamida nechta noyob operator kodi (raqamning +998 dan 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.
  • set takrorlanmaydigan elementlarni saqlaydi va in amalini juda tez bajaradi.
  • To'plamlar ustida |, &, -, ^ amallari mavjud.

Keyingi bo'limda dasturga qaror qabul qilishni o'rgatamiz - shart operatorlari.

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.