23. Dictionary — Solusi Pekerjaan Rumah

File solusi .py ada di exercises/23/homework/solutions/.

Soal 1 — Catatan player

Soal. Buat dictionary player; cetak setiap field dengan .items().

Cara berpikir. Literal dengan empat key, loop for k, v in player.items():, satu print per pasangan.

Solusi.

player = {
    "name": "Keiko",
    "class": "Mage",
    "level": 7,
    "alive": True,
}

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

Python 3.7+ mempertahankan urutan penyisipan, jadi field dicetak sesuai urutan yang kamu tulis.

Kesalahan umum.

  • Menulis player.name alih-alih player["name"]. Dictionary Python tidak mendukung notasi titik — sintaks itu untuk atribut objek.
  • Menggunakan player[name] (tanpa tanda kutip). name tanpa tanda kutip adalah variable; Python mencari variable name, bukan string "name".

Soal 2 — Bobot inventaris

Soal. Jumlahkan nilai-nilai dalam dictionary.

Cara berpikir. Gunakan .items() atau .values(). Simpan total yang berjalan seperti di Bab 22. Atau, sum(d.values()) melakukannya dalam satu pemanggilan.

Solusi.

inventory = {
    "sword": 3.5,
    "shield": 5.0,
    "potion": 0.2,
    "map": 0.1,
    "coins": 0.05,
}

total = 0
for _, weight in inventory.items():
    total = total + weight

print(f"Total weight: {total:.2f}")

Atau lebih singkat:

print(f"Total weight: {sum(inventory.values()):.2f}")

_ mengabaikan key; jumlah hanya membutuhkan nilai-nilainya.

Kesalahan umum.

  • Mencoba for i, weight in enumerate(inventory):. enumerate pada dictionary memberikan key, bukan nilai. Gunakan .values() atau .items().

Soal 3 — Pencarian aman

Soal. lookup(d, key) mengembalikan nilai atau "(not found)".

Cara berpikir. Periksa key in d terlebih dahulu. Kembalikan nilai jika ditemukan; jika tidak, kembalikan string placeholder. Atau, gunakan .get(key) dan periksa None.

Solusi.

def lookup(d, key):
    if key in d:
        return d[key]
    return "(not found)"

player = {"name": "Keiko", "level": 7}

print(lookup(player, "name"))     # Keiko
print(lookup(player, "email"))    # (not found)

key = "level"
print(lookup(player, key))        # 7

Kesalahan umum.

  • Menggunakan if d[key]: alih-alih if key in d:. Ketika key tidak ada, d[key] memunculkan KeyError sebelum if bisa dievaluasi. Selalu periksa keanggotaan dengan in terlebih dahulu.
  • Menggunakan if d.get(key): dan lupa bahwa False dan 0 bersifat falsy. Dictionary yang menyimpan "flag": False akan salah dilaporkan sebagai tidak ditemukan. Pengecekan key in d menghindari itu.

Tantangan — Frekuensi kata

Soal. Hitung kemunculan setiap kata dalam list.

Cara berpikir. Telusuri list sekali. Untuk setiap kata, cari di counts; jika belum ada, anggap hitungannya 0, lalu tambahkan 1 dan simpan kembali.

Idiom Python-nya adalah counts.get(word, 0) — mengembalikan 0 ketika kata belum ada di dictionary.

Solusi.

words = ["apple", "banana", "apple", "cherry", "apple", "banana"]

counts = {}
for word in words:
    counts[word] = counts.get(word, 0) + 1

for word, count in counts.items():
    print(word, count)

Output (sesuai urutan penyisipan):

apple 3
banana 2
cherry 1

Kesalahan umum.

  • Menulis counts[word] = counts[word] + 1 tanpa .get(word, 0). Pertama kali sebuah kata dilihat, counts[word] memunculkan KeyError.
  • Menggunakan collections.Counter. Itu adalah alat produksi yang bekerja dengan sempurna, tapi membangun loop secara manual terlebih dahulu menunjukkan mekanismenya.

Selesai?

Berikutnya, List methods memberikan alat siap pakai untuk mengurutkan, membalik, dan mentransformasi list, dan bab terakhir Part 5 memisahkan kode ke beberapa file menggunakan module. Setelah itu, mini-project Part 5 — Petualangan Teks — menggabungkan dictionary, function, dan module menjadi dunia game kecil.