Dict & Set Comprehension untuk Data
Bangun dictionary dan set dalam satu baris: mapping kode ke nama, daftar nilai unik, dan frekuensi kemunculan.
Saudara Kembar List Comprehension
Kalau list comprehension menghasilkan list, dict dan set comprehension menghasilkan dictionary dan set dengan sintaks yang mirip. Bedanya cuma tanda kurungnya: kurung kurawal, dan untuk dict ada pasangan kunci: nilai.
Kenapa penting untuk data analyst? Karena dua struktur ini adalah senjata harian. Dictionary untuk mapping (kode produk ke nama produk, singkatan kota ke nama kota), set untuk daftar nilai unik (berapa kategori berbeda di kolom ini?), dan dict comprehension untuk menghitung frekuensi.
Dict Comprehension: Mapping Sekejap
kode = ["P001", "P002", "P003"]
nama = ["Kopi Susu", "Teh Manis", "Jus Alpukat"]
mapping = {k: n for k, n in zip(kode, nama)}
print(mapping)
# {'P001': 'Kopi Susu', 'P002': 'Teh Manis', 'P003': 'Jus Alpukat'}
print(mapping["P002"]) # Teh ManisContoh realistis, mengubah harga jadi harga setelah diskon untuk seluruh katalog:
harga = {"kopi": 18000, "teh": 12000, "jus": 20000, "roti": 10000}
diskon = {item: int(h * 0.9) for item, h in harga.items()}
print(diskon) # {'kopi': 16200, 'teh': 10800, 'jus': 18000, 'roti': 9000}Kondisi if juga bisa dipakai, misalnya hanya produk di atas 15000:
mahal = {item: h for item, h in harga.items() if h > 15000}
print(mahal) # {'kopi': 18000, 'jus': 20000}Menghitung Frekuensi dengan Dict Comprehension
Ini pola yang sangat sering dipakai sebelum kenal pandas: hitung berapa kali tiap nilai muncul.
kota = ["Jakarta", "Bandung", "Jakarta", "Surabaya", "Bandung", "Jakarta"]
frekuensi = {k: kota.count(k) for k in set(kota)}
print(frekuensi) # {'Jakarta': 3, 'Bandung': 2, 'Surabaya': 1}Perhatikan triknya: iterasi di atas set(kota) supaya tiap kota unik hanya dihitung sekali. Tanpa set(), count() akan dipanggil berulang untuk kota yang sama.
Set Comprehension: Nilai Unik Otomatis
Set otomatis membuang duplikat. Berguna untuk menjawab "ada berapa kategori unik?" dalam sekejap.
kategori = ["minuman", "makanan", "minuman", "snack", "makanan", "minuman"]
unik = {k for k in kategori}
print(unik) # {'minuman', 'makanan', 'snack'} (urutan bisa berbeda)
print(len(unik)) # 3 kategori unikContoh data yang lebih kotor, mengekstrak domain email unik:
email = ["[email protected]", "[email protected]", "[email protected]", "[email protected]"]
domain = {e.split("@")[1] for e in email}
print(domain) # {'mail.com', 'web.id'}Catatan teknis:
{}kosong selalu berarti dict kosong, bukan set kosong. Untuk set kosong pakaiset(). Ini jebakan klasik yang sering bikin errorAttributeErrorsaat memanggil method set.
Jebakan Umum
SALAH, kunci duplikat diam-diam menimpa data:
# Jangan: kalau ada kode ganda, data lama hilang tanpa peringatan
kode_ganda = [("P001", "Kopi"), ("P001", "Teh")]
mapping = {k: v for k, v in kode_ganda}
print(mapping) # {'P001': 'Teh'} <- "Kopi" hilang!BENAR, cek duplikat dulu sebelum membuat mapping:
# Lakukan: pastikan kunci unik
kode_ganda = [("P001", "Kopi"), ("P001", "Teh")]
kunci = [k for k, v in kode_ganda]
if len(kunci) != len(set(kunci)):
print("Peringatan: ada kode duplikat!")SALAH, memakai count() di dalam comprehension untuk list besar:
# Jangan: O(n^2), lambat untuk puluhan ribu baris
data = ["a", "b", "a", "c"] * 10000
freq = {x: data.count(x) for x in set(data)}BENAR, untuk data besar pakai collections.Counter:
# Lakukan: O(n), jauh lebih cepat
from collections import Counter
freq = Counter(data)
print(freq) # Counter({'a': 20000, 'b': 10000, 'c': 10000})Tantangan
Mapping kode kota dan hitung frekuensi
Diberi list tuple [("JKT", "Jakarta"), ("BDG", "Bandung"), ("SBY", "Surabaya")] dan list transaksi kota ["JKT", "BDG", "JKT", "SBY", "JKT"]. (1) Buat dict mapping kode ke nama kota dengan dict comprehension. (2) Hitung frekuensi tiap kode dengan dict comprehension + set.