Kursus Python / Mengelola kunci, nilai, dan total dengan dictionary
Dictionary mencari nilai berdasarkan kunci. Gunakan struktur ini untuk catatan dengan nama kolom atau total menurut kategori, lalu tentukan apakah kunci yang tidak ada merupakan kesalahan atau boleh memakai nilai bawaan.
Pahami kunci dan penggantian nilai
Dictionary ditulis sebagai pasangan key: value di dalam kurung kurawal. Penugasan ke kunci yang sudah ada mengganti nilainya, bukan menambahkan kejadian kedua dari kunci yang sama. Kunci berupa string membedakan huruf besar-kecil dan spasi, sehingga "food", "Food", dan "food " adalah kunci berbeda.
expense = {"name": "lunch", "amount": 8000}
expense["amount"] = 9000
print(expense["amount"])
Hasilnya 9000. Kunci "amount" sudah ada, sehingga nilainya diperbarui tanpa menambah jumlah kunci. Dictionary mempertahankan urutan penyisipan, bukan mengurutkan otomatis berdasarkan nama atau jumlah. Penggantian nilai kunci lama tidak memindahkan posisinya ke akhir. Jika keluaran membutuhkan urutan tertentu, tentukan pengurutan secara eksplisit.
Kunci harus hashable: objek menyediakan nilai hash yang tetap selama masa hidupnya dan objek yang dibandingkan sama harus memiliki hash yang sama. String dan integer merupakan pilihan umum, sedangkan list tidak dapat dipakai. Tuple juga tidak dapat dipakai jika mengandung list. Rinciannya ada pada definisi hashable di glosarium Python.
Bangun total menurut kategori
Simpan kode lengkap berikut sebagai dicts.py dengan encoding UTF-8. Gunakan Python 3.12 atau lebih baru dan jalankan python dicts.py pada terminal lingkungan proyek. Seluruh data ada di dalam skrip sehingga tidak diperlukan berkas masukan atau paket tambahan.
expenses = [("food", 8000), ("transport", 2500), ("food", 3500)]
totals = {}
for category, amount in expenses:
totals[category] = totals.get(category, 0) + amount
for category, total in sorted(totals.items()):
print(category, total)
print(totals.get("books", 0))
Keluaran yang diharapkan:
food 11500
transport 2500
0
Pada masukan pertama kategori food belum ada, sehingga get(category, 0) memberikan nol dan penugasan menyimpan total awal 8000. Kategori transport mulai dari nol dengan cara yang sama. Ketika food muncul lagi, nilai 8000 ditambah 3500 menjadi 11500.
totals.items() menyediakan pasangan kunci dan nilai. sorted(...) pada contoh mengurutkan pasangan menurut kunci kategori terlebih dahulu, sehingga keluaran memiliki urutan yang diminta. Ini berbeda dari mempertahankan urutan masukan. Baris terakhir mencari books yang tidak ada dan menampilkan nol tanpa menambah kategori tersebut.
Pilih akses wajib atau nilai bawaan
totals["books"] menghasilkan KeyError jika kunci tidak ada. totals.get("books", 0) mengembalikan nol tanpa memasukkan kunci itu. Nilai awal nol masuk akal saat menjumlahkan kontribusi pertama, tetapi dapat menyembunyikan kesalahan jika kolom wajib suatu catatan sebenarnya hilang. Gunakan "books" in totals untuk menguji keberadaan kunci secara langsung.
Kunci yang ada dengan nilai None juga tidak sama dengan kunci yang tidak ada. get("books", 0) mengembalikan None jika nilai itu tersimpan, bukan menggantinya dengan nol. Karena itu, aturan nilai kosong dan aturan kunci hilang perlu diputuskan secara terpisah.
Iterasi langsung for key in totals menghasilkan kunci. Gunakan values() untuk nilai atau items() untuk pasangan. totals.copy() membuat salinan dangkal: wadah luar berbeda, tetapi list yang disimpan sebagai nilai tetap dapat dibagi bersama. Bandingkan tingkat salinan ini dengan salinan dan referensi bersama pada list.
Referensi dictionary Python 3.12 menjelaskan akses kunci, metode, dan urutan. Jika pola memulai total dari nol berulang, defaultdict(int) dari modul collections dapat dipertimbangkan. Namun, akses kurung siku pada kunci yang hilang di defaultdict dapat membuat entri baru; hal ini berbeda dari dict.get(). Perbedaannya dijelaskan dalam dokumentasi defaultdict.
Uji normalisasi dan perubahan kumpulan kunci
- Ubah kontribusi
foodterakhir dari3500menjadi4500. Hanya totalfoodberubah menjadi12500;transporttetap2500. - Kembalikan jumlah semula, lalu ubah kategori pada catatan terakhir dari
foodmenjadiFood. Keduanya menjadi kelompok terpisah:Foodbernilai3500, sedangkanfoodbernilai8000. - Tentukan apakah perbedaan huruf atau spasi memang bermakna sebelum menormalkannya. Jika
booksmerupakan kategori wajib, periksa keberadaannya alih-alih membiarkan nilai bawaan menyembunyikan kekurangan data. - Pulihkan jumlah dan kategori asli, lalu cocokkan kembali seluruh keluaran.
Menambah atau menghapus kunci saat mengiterasi dictionary yang sama dapat menghasilkan RuntimeError. Kumpulkan kunci sasaran terlebih dahulu, iterasikan salinan kunci, atau buat dictionary hasil baru. Memperbarui nilai suatu kunci dan mengubah kumpulan kunci bukan operasi yang sama; pilih cara yang membuat maksud pengolahan data jelas.




