pythoncomprehensionMenengah5 mnt baca

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

python
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 Manis

Contoh realistis, mengubah harga jadi harga setelah diskon untuk seluruh katalog:

python
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:

python
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.

python
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.

python
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 unik

Contoh data yang lebih kotor, mengekstrak domain email unik:

python
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 pakai set(). Ini jebakan klasik yang sering bikin error AttributeError saat memanggil method set.

Jebakan Umum

SALAH, kunci duplikat diam-diam menimpa data:

python
# 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:

python
# 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:

python
# 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:

python
# 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.