Гузариш ба мундариҷа
Мавзӯи 13 аз 18

Луғатҳо

Рӯйхат қиматҳоро аз рӯи рақамҳо нигоҳ медорад: a[0], a[1], … Агар ҷустан на аз рӯи рақам, балки аз рӯи ном қулайтар бошад-чӣ: нарх аз рӯи номи мол, телефон аз рӯи номи одам, шумора аз рӯи калима? Барои ин луғатҳо ҳастанд.

Луғат: калид → қимат

prices = {"нон": 45, "шир": 89, "панир": 320}
print(prices["шир"])        # 89

Луғат ҷуфтҳои калид: қимат-ро нигоҳ медорад. Аз рӯи калид қимат фавран, бе гузаштан ёфт мешавад — ҳамон қадар зуд, мисли санҷиш дар маҷмӯъ.

Илова ё иваз кардани қимат:

prices["чой"] = 150         # калиди нав — ҷуфт илова мешавад
prices["нон"] = 50          # мавҷуда — қимат иваз мешавад
print(len(prices))          # 4

Калид дар луғат ҳамеша якто аст: навиштани такрорӣ аз рӯи ҳамон калид қиматро аз нав менависад.

Чунин калид нест

Муроҷиат ба калиди мавҷуднабуда — хатои KeyError:

print(prices["қаҳва"])      # KeyError

Вариантҳо:

if "қаҳва" in prices:       # санҷиши калид
    print(prices["қаҳва"])

print(prices.get("қаҳва"))       # None — калид нест
print(prices.get("қаҳва", 0))    # 0 — қимати пешфарзи худ

Нест кардани калид: del prices["панир"] ё prices.pop("панир").

Гузаштан аз луғат

ages = {"Анис": 12, "Бахтиёр": 14, "Вафо": 13}

for name in ages:                 # калидҳо гузаронида мешаванд
    print(name)

for name, age in ages.items():    # ҷуфтҳои калид-қимат
    print(name, age)

print(list(ages.values()))        # [12, 14, 13]
print(sorted(ages))               # калидҳо аз рӯи алифбо

Луғат тартиберо, ки калидҳо илова шуда буданд, дар хотир дорад. Агар тартиби дигар лозим бошад — мураттаб кун.

Ҳисоби басомадҳо

Истифодаи маъмултарини луғат — ҳисоб кардани он ки ҳар қимат чанд бор вомехӯрад:

words = "гурба саг гурба моҳӣ саг гурба".split()
count = {}
for w in words:
    count[w] = count.get(w, 0) + 1
print(count)    # {'гурба': 3, 'саг': 2, 'моҳӣ': 1}

count.get(w, 0) шумораи ҷориро ё 0-ро, агар калима бори аввал вохӯрда бошад, бармегардонад.

Калиди қиматаш калонтаринро бо гузаштани оддӣ ё тавассути max(count, key=count.get) ёфтан мумкин аст — вале дар хотир дор, ки ҳангоми баробарӣ max калиди аввалини чунинро бо тартиби луғат бармегардонад.

Counter

Барои ҳисоб асбоби тайёр ҳаст:

from collections import Counter
c = Counter("abracadabra")
print(c["a"])               # 5
print(c.most_common(2))     # [('a', 5), ('b', 2)]

Гурӯҳбандӣ

Қимати луғат метавонад ҳар чиз бошад, масалан рӯйхат. Ҳамин тавр маълумотро аз рӯи аломат гурӯҳбандӣ мекунанд:

words = ["анор", "бодиринг", "анҷир", "барг", "гелос"]
by_letter = {}
for w in words:
    first = w[0]
    if first not in by_letter:
        by_letter[first] = []
    by_letter[first].append(w)
print(by_letter["б"])     # ['бодиринг', 'барг']

Калид метавонад ҳар қимати тағйирнопазир бошад: адад, сатр, кортеж. Масалан, координатаҳои (x, y) — калиди хуб аст, рӯйхат бошад — не. Агар аз рӯи «маҷмӯи» қиматҳо гурӯҳбандӣ кардан лозим бошад, онро ба сатр ё кортеж табдил деҳ.

Луғат ба ҷои if-и дароз

days = {1: "дш", 2: "сш", 3: "чш", 4: "пш", 5: "ҷм", 6: "шб", 7: "яш"}
n = int(input())
print(days.get(n, "чунин рӯз нест"))

Хулоса

  • луғат — ҷуфтҳои калид: қимат, дастрасии d[калид] фаврӣ кор мекунад;
  • навиштан аз рӯи калиди мавҷуда қиматро иваз мекунад;
  • in, get(калид, пешфарз) аз KeyError ҳимоя мекунанд;
  • items(), keys(), values() — гузаштан;
  • d[x] = d.get(x, 0) + 1 — ҳисоби басомадҳо; Counter — ҳамин, тайёр;
  • калидҳо — танҳо қиматҳои тағйирнопазир: ададҳо, сатрҳо, кортежҳо.