pythoncomprehensionMenengah5 mnt baca

List Comprehension: Dari Loop ke One-Liner

Ubah loop for yang panjang menjadi satu baris ekspresif, lengkap dengan kondisi if untuk filtering data.

Loop yang Dipadatkan Jadi Satu Baris

List comprehension itu seperti mesin press. Kamu memasukkan loop for yang bertele-tele dari satu sisi, keluar dari sisi lain sebagai satu baris yang rapi dan cepat dibaca.

Kenapa penting untuk data analyst? Karena 80 persen kerja data adalah transformasi list atau kolom: ubah semua nama jadi huruf kecil, ambil hanya transaksi di atas seratus ribu, konversi string angka jadi integer. Comprehension membuat transformasi itu singkat dan jelas maksudnya.

Dari Loop Biasa ke Comprehension

Perhatikan pola yang sama, hasil yang sama, tapi bentuk yang jauh lebih ringkas.

python
# Cara lama: 4 baris
kuadrat = []
for angka in range(1, 6):
    kuadrat.append(angka ** 2)
print(kuadrat)  # [1, 4, 9, 16, 25]

# Cara comprehension: 1 baris
kuadrat = [angka ** 2 for angka in range(1, 6)]
print(kuadrat)  # [1, 4, 9, 16, 25]

Polanya selalu: [ekspresi for item in iterable]. Baca dari kanan ke kiri kalau bingung, "untuk setiap item di iterable, hasilkan ekspresi".

Contoh yang lebih dekat ke kerja data, membersihkan nama produk:

python
nama_kotor = ["  Kopi Susu", "TEH MANIS  ", " jus alpukat"]
nama_bersih = [nama.strip().lower() for nama in nama_kotor]
print(nama_bersih)  # ['kopi susu', 'teh manis', 'jus alpukat']

Menambah Kondisi if

Comprehension bisa menyaring sekaligus mentransformasi. Syaratnya ditulis di belakang.

python
transaksi = [45000, 120000, 80000, 250000, 60000]

# Ambil yang >= 100000, lalu beri label
besar = [f"Rp{t:,}" for t in transaksi if t >= 100000]
print(besar)  # ['Rp120,000', 'Rp250,000']

Versi realistis, memisahkan email valid dari daftar mentah:

python
kontak = ["[email protected]", "bukan-email", "[email protected]", "", "[email protected]"]
valid = [e.strip() for e in kontak if "@" in e and e.strip()]
print(valid)  # ['[email protected]', '[email protected]', '[email protected]']

if-else di Dalam Comprehension

Kalau butuh dua cabang hasil, if-else ditulis di depan for. Urutannya memang terasa terbalik di awal, tapi lama-lama terbiasa.

python
skor = [85, 55, 90, 40, 70]
status = ["lulus" if s >= 60 else "remedial" for s in skor]
print(status)  # ['lulus', 'remedial', 'lulus', 'remedial', 'lulus']

Catatan teknis: List comprehension lebih cepat dari loop append biasa karena optimasi di level interpreter, dan variabel loop-nya tidak bocor ke scope luar (berbeda dengan Python 2 dulu).

Jebakan Umum

SALAH, comprehension yang terlalu bertingkat sampai tidak terbaca:

python
# Jangan: butuh 30 detik untuk paham
hasil = [[y for y in range(x) if y % 2 == 0] for x in range(10) if x > 3]

BENAR, pecah jadi langkah bernama kalau sudah kompleks:

python
# Lakukan: nested comprehension maksimal 1 level, atau pakai loop biasa
genap_per_baris = []
for x in range(10):
    if x > 3:
        genap_per_baris.append([y for y in range(x) if y % 2 == 0])

SALAH, lupa comprehension selalu menghasilkan list baru:

python
# Jangan: berharap list asli berubah
harga = [10000, 20000, 30000]
[h + 5000 for h in harga]
print(harga)  # tetap [10000, 20000, 30000], tidak berubah!

BENAR, tangkap hasilnya ke variabel:

python
# Lakukan: assign ulang atau ke variabel baru
harga = [10000, 20000, 30000]
harga = [h + 5000 for h in harga]
print(harga)  # [15000, 25000, 35000]

Tantangan

Filter dan konversi data transaksi

Kamu punya list string transaksi: ["15000", "n/a", "25000", "-", "30000", "n/a"]. Dengan SATU list comprehension, buat list baru berisi integer hanya dari entri yang berupa angka (lewati "n/a" dan "-").