23. Dictionary

Sebuah dictionary memetakan key ke nilai. Alih-alih posisi (0, 1, 2), kamu mencari sesuatu berdasarkan nama — seperti mencari kata di kamus sungguhan.

Membuat dictionary

Sintaks literal menggunakan kurung kurawal dengan pasangan "key": value:

player = {
    "name": "Keiko",
    "level": 7,
    "hp": 95,
    "alive": True,
}

Koma di akhir bersifat opsional, tapi gaya yang baik: memudahkan penambahan field menjadi diff satu baris nanti.

Baca nilai dengan notasi bracket:

print(player["name"])    # Keiko
print(player["level"])   # 7

Python tidak mendukung notasi titik (player.name) untuk dictionary. Kamu selalu menggunakan player["name"].

Ketika key disimpan dalam variable, itu juga berfungsi:

field = "hp"
print(player[field])   # 95

Menambah dan mengubah field

Menugaskan ke key yang belum ada akan membuatnya; menugaskan ke key yang sudah ada akan menggantinya; del menghapusnya:

player["mana"] = 30       # new key
player["hp"] = 100        # replace existing
del player["alive"]       # delete

Setelah tiga baris tersebut, player menyimpan "name", "level", "hp", "mana".

Loop dengan .items()

.items() memberikan setiap pasangan key-value sesuai urutan penyisipan:

for key, value in player.items():
    print(key, value)

Python 3.7+ menjamin bahwa .items() mengembalikan pasangan sesuai urutan kamu menyisipkannya. Jika butuh urutan alfabet, urutkan key-nya:

for key in sorted(player.keys()):
    print(key, player[key])

Jangan gunakan for key in player: lalu mencoba menghapus key di dalam loop — Python memunculkan RuntimeError jika kamu mengubah ukuran dictionary saat sedang diiterasi. Buat list key yang akan dihapus terlebih dahulu, lalu hapus setelah loop.

Memeriksa apakah key ada

Gunakan operator in:

if "email" in player:
    print(player["email"])
else:
    print("No email on file.")

Mengakses key yang tidak ada secara langsung akan memunculkan KeyError. Pengecekan in menghindari itu. Alternatifnya, .get(key) mengembalikan None untuk key yang tidak ada tanpa memunculkan error:

print(player.get("email"))          # None
print(player.get("email", "n/a"))   # n/a  (default if missing)

Dictionary bersarang

Nilai dictionary bisa berupa dictionary lain (atau list) — cara standar untuk membangun data terstruktur:

player = {
    "name": "Keiko",
    "position": {"x": 0, "y": 5, "z": -3},
    "inventory": ["sword", "potion", "map"],
}

print(player["position"]["x"])    # 0
print(player["inventory"][0])     # sword

Inilah persis cara game engine dan API web mengirimkan data.

Dictionary dan list bersama

List of dictionary adalah pola umum — leaderboard, database item, file save:

quest = {
    "name": "Healer's Errand",
    "reward": 50,
    "steps": [
        "Speak to the elder",
        "Collect 5 herbs",
        "Return to camp",
    ],
}

print(quest["name"])         # Healer's Errand
print(quest["steps"][0])     # Speak to the elder
print(len(quest["steps"]))   # 3

Pekerjaan Rumah

Soal 1 — Catatan player

Buka exercises/23/homework/01-player-record.py. Buat dictionary player dengan setidaknya empat key ini: "name" (string), "class" (string), "level" (number), "alive" (boolean). Lalu loop dengan for key, value in player.items(): untuk mencetak setiap key dan nilai, satu per baris.

Soal 2 — Bobot inventaris

Buka exercises/23/homework/02-inventory-weights.py. Sebuah dictionary memetakan nama item ke beratnya (angka). Hitung dan cetak total beratnya.

Soal 3 — Pencarian aman

Buka exercises/23/homework/03-safe-lookup.py. Tulis function lookup(d, key) yang mengembalikan nilai jika key ada, atau string "(not found)" jika tidak. Uji dengan tiga pemanggilan: satu yang berhasil, satu yang gagal, dan satu di mana key disimpan dalam variable.

Tantangan — Frekuensi kata

Buka exercises/23/homework/04-word-frequency.py. Diberikan list kata (beberapa diulang), buat dictionary yang memetakan setiap kata unik ke jumlah kemunculannya. Cetak dictionary-nya satu pasangan per baris.

Bingung atau sudah selesai? Buka halaman solusi pekerjaan rumah.