Dictionary menyimpan data berpasangan key-value, dan sering kali kita perlu membangun dictionary baru dari koleksi yang sudah ada: menghitung nilai turunan untuk setiap key, membalik arah pencarian, atau menyaring item yang tidak relevan. Dengan loop biasa, pekerjaan tersebut butuh inisialisasi dictionary kosong plus if dan penugasan per elemen. Dictionary comprehension menyatukan semuanya dalam satu ekspresi {key: value for item in iterable}.
Sintaks Dasar #
Bentuk umumnya {kunci: nilai for item in iterable} — mirip list comprehension, tetapi ekspresi di depan terdiri dari dua bagian yang dipisah titik dua. Sumber paling sering adalah dictionary lain lewat .items(), yang mengeluarkan pasangan key-value siap pakai.
negara = ["indonesia", "jepang", "portugal"]
jumlah_huruf = {nama: len(nama) for nama in negara}
print(jumlah_huruf)Output yang Dihasilkan:
{'indonesia': 9, 'jepang': 6, 'portugal': 8}Mari kita bedah proses pada baris 3 (jumlah_huruf = {nama: len(nama) for nama in negara}):
- Bagian
for nama in negara: interpreter mengambil setiap nama negara dari list sumber. - Bagian
nama:: nama negara menjadi key pada dictionary baru. - Bagian
len(nama): panjang nama negara dihitung menjadi value. - Pengumpulan: setiap pasangan
nama: len(nama)dimasukkan ke dictionary hasil; urutan pencetakan dictionary mengikuti urutan penyimpanan.
Membalik Pasangan Key dan Value #
Pola {v: k for k, v in asal.items()} membalik arah pencarian: value lama menjadi key baru. Ini berguna ketika kita sering mencari berdasarkan nilai yang tadinya tersimpan di sisi kanan.
kode_produk = {"kopi": "P001", "teh": "P002", "susu": "P003"}
nama_dari_kode = {kode: nama for nama, kode in kode_produk.items()}
print(nama_dari_kode)Output yang Dihasilkan:
{'P001': 'kopi', 'P002': 'teh', 'P003': 'susu'}Unpacking for nama, kode in ... memecah setiap tuple .items() menjadi dua variabel, lalu posisinya ditukar di bagian kode: nama. Syarat pentingnya: value asal harus unik. Jika ada dua key dengan value sama, value tersebut bertabrakan sebagai key baru dan hanya pasangan terakhir yang selamat:
stok = {"kopi": 12, "teh": 0, "susu": 12}
dari_jumlah = {jumlah: nama for nama, jumlah in stok.items()}
print(dari_jumlah)Output yang Dihasilkan:
{12: 'susu', 0: 'teh'}Kopi lenyap dari hasil — angka 12 milik “kopi” terlebih dahulu menjadi key, lalu ditimpa oleh 12 milik “susu”. Pembalikan seperti ini aman hanya jika kita yakin tidak ada nilai ganda.
Menyaring Item Dictionary #
Klausa if bekerja seperti pada list comprehension: elemen yang tidak lolos syarat tidak masuk ke dictionary hasil.
stok = {"kopi": 12, "teh": 0, "susu": 4, "gula": 0}
tersedia = {nama: jumlah for nama, jumlah in stok.items() if jumlah > 0}
print(tersedia)Output yang Dihasilkan:
{'kopi': 12, 'susu': 4}Dua produk dengan stok 0 tersaring keluar tanpa perlu if terpisah di dalam loop. Pola tiga bagian ini — kunci: nilai, for ... in ...items(), if syarat — adalah kombinasi yang akan sering kita tulis saat membersihkan data.
Perbandingan dengan dict.fromkeys #
Method dict.fromkeys() membangun dictionary dari daftar key dengan satu nilai yang sama untuk semuanya. Keduanya punya wilayah kerja berbeda:
produk = ["kopi", "teh", "susu"]
# Comprehension: nilai dihitung untuk setiap key
diskon = {p: 10 for p in produk}
print(diskon)
# dict.fromkeys: satu nilai default untuk semua key
stok_awal = dict.fromkeys(produk, 0)
print(stok_awal)
# Jebakan: nilai mutable dipakai bersama
keranjang = dict.fromkeys(produk, [])
keranjang["kopi"].append("kupon 10%")
print(keranjang)Output yang Dihasilkan:
{'kopi': 10, 'teh': 10, 'susu': 10}
{'kopi': 0, 'teh': 0, 'susu': 0}
{'kopi': ['kupon 10%'], 'teh': ['kupon 10%'], 'susu': ['kupon 10%']}| Kebutuhan | Alat yang tepat |
|---|---|
| Nilai berbeda per key, dihitung dari key atau data lain | dictionary comprehension |
| Nilai konstan sama untuk semua key | dict.fromkeys(keys, nilai) |
Nilai default berupa angka/string/None | dict.fromkeys() aman dipakai |
| Nilai default berupa list/dict | comprehension {k: [] for k in keys} agar tiap key punya list sendiri |