Sebagian besar pekerjaan persiapan data berpola sama: membangun list baru dari list lama — mengubah satuan, menyaring nilai, atau keduanya sekaligus. Perulangan for dengan append() selalu bisa menyelesaikannya, tetapi kode menjadi tiga baris untuk gagasan yang sesungguhnya hanya satu baris. List comprehension adalah cara khas Python menuliskan pola tersebut secara ringkas tanpa mengurangi keterbacaan, dan idiom ini muncul di hampir semua kode analisis yang akan kita temui. Pada chapter ini kita membedah bentuk dasarnya, perbandingannya dengan loop biasa, versi dictionary-nya, dan batas kapan ia justru tidak layak dipakai.

Bentuk Dasar List Comprehension #

Bentuk umumnya adalah [hasil for elemen in sumber] — untuk setiap elemen di sumber, hitung hasil, lalu kumpulkan semuanya menjadi list baru. Kita mulai dari data penjualan harian Toko Kopi Kita (cangkir per hari) dengan dua kebutuhan yang paling sering muncul: transformasi dan filter.

python
penjualan = [120, 135, 98, 150, 122, 168, 175]

dalam_lusinan = [round(n / 12, 1) for n in penjualan]
print("Penjualan per lusin:", dalam_lusinan)

hari_sibuk = [n for n in penjualan if n > 130]
print("Hari sibuk         :", hari_sibuk)

Output yang Dihasilkan:

text
Penjualan per lusin: [10.0, 11.2, 8.2, 12.5, 10.2, 14.0, 14.6]
Hari sibuk         : [135, 150, 168, 175]

Mari kita baca kedua comprehension di atas:

  1. Baris 3 (round(n / 12, 1) for n in penjualan): untuk setiap n di penjualan, hasilkan round(n / 12, 1). Pembacaannya dimulai dari klausa for — “untuk setiap n” — lalu ekspresi di depan adalah apa yang dimasukkan ke list baru. Hasilnya list baru dengan panjang yang sama, isinya nilai lama dalam satuan lusinan.
  2. Baris 6 (n for n in penjualan if n > 130): klausa if di ekor menyaring sebelum elemen dimasukkan, sehingga panjang hasil bisa lebih pendek dari sumbernya. Karena ekspresinya hanya n, elemen lolos apa adanya tanpa diubah.

Perhatikan bahwa list sumber tidak berubah — comprehension selalu menghasilkan list baru. Sifat ini sehat untuk alur kerja analisis: data asli tetap utuh, dan setiap tahap transformasi menghasilkan turunan yang bisa diperiksa ulang.

Menggabungkan Filter dan Transformasi #

Kedua pola tadi bisa digabung dalam satu comprehension: filter dulu dengan if, lalu transformasi pada elemen yang lolos. Misalnya kita hanya ingin menagih pajak pada transaksi di atas 40 ribu rupiah.

python
transaksi = [42, 18, 65, 30, 25, 55]

besar_pajak = [round(n * 1.1, 2) for n in transaksi if n > 40]
print("Transaksi di atas 40 ribu setelah pajak:", besar_pajak)

Output yang Dihasilkan:

text
Transaksi di atas 40 ribu setelah pajak: [46.2, 71.5, 60.5]

Urutan membacanya tetap satu: mulai dari for n in transaksi, lalu kondisi if n > 40 menyaring tiga transaksi yang lolos (42, 65, 55), terakhir ekspresi round(n * 1.1, 2) mengubah masing-masing menjadi nilai setelah pajak. Enam data masuk, tiga keluar — filter dan transformasi bekerja dalam satu baris yang tetap terbaca sebagai kalimat.

List Comprehension versus Loop Biasa #

Kapan keduanya menghasilkan hal yang sama, dan apa bedanya? Contoh berikut mengerjakan tugas identik dengan dua cara — menambahkan biaya layanan 10% pada tiap transaksi:

python
transaksi = [42, 18, 65, 30, 25, 55]

# Cara 1: loop biasa dengan append
hasil_loop = []
for nilai in transaksi:
    hasil_loop.append(round(nilai * 1.1, 2))

# Cara 2: list comprehension, hasil sama
hasil_lc = [round(nilai * 1.1, 2) for nilai in transaksi]

print("Hasil loop          :", hasil_loop)
print("Hasil comprehension :", hasil_lc)
print("Keduanya sama?      :", hasil_loop == hasil_lc)

Output yang Dihasilkan:

text
Hasil loop          : [46.2, 19.8, 71.5, 33.0, 27.5, 60.5]
Hasil comprehension : [46.2, 19.8, 71.5, 33.0, 27.5, 60.5]
Keduanya sama?      : True

Keduanya benar; pilihan kita soal keterbacaan dan konteks. Ringkasan perbandingannya:

AspekLoop biasaList comprehension
Baris intiTiga baris: inisialisasi, perulangan, appendSatu baris
KecocokanBadan loop panjang, banyak kondisi, atau ada efek samping seperti printTransformasi dan filter yang ringkas
Kesan bacaEksplisit langkah demi langkahRingkas; terasa alami setelah terbiasa

Dalam tim data, comprehension satu baris untuk transformasi sederhana lazim dianggap lebih mudah dipindai daripada loop tiga baris, karena seluruh logika terlihat sekaligus di satu tempat.

Dict Comprehension #

Pola yang sama bekerja untuk dictionary: {kunci: nilai for ...}. Kebutuhannya sering muncul saat kita membangun pemetaan baru dari pemetaan lama, misalnya menghitung harga khusus pelanggan member:

python
harga = {"kopi susu": 24, "americano": 22, "matcha": 28, "teh tawar": 20}

harga_member = {
    produk: round(nilai * 0.9, 1) for produk, nilai in harga.items()
}
print(harga_member)

Output yang Dihasilkan:

text
{'kopi susu': 21.6, 'americano': 19.8, 'matcha': 25.2, 'teh tawar': 18.0}

Bagian for produk, nilai in harga.items() mengulang pola iterasi dictionary dari chapter Struktur Data Python ; ekspresi di depan kini berbentuk pasangan kunci: nilai — produk tetap sebagai kunci, harganya didiskon 10%. Filter dengan if juga bisa ditempel di ekornya dengan cara yang sama seperti list comprehension.

Kapan List Comprehension Tidak Layak #

Keringkasan punya batas. Comprehension dirancang untuk satu transformasi dan satu filter; ketika logikanya bertambah, kebalikannya yang terjadi — kode justru menjadi sulit dibaca. Beberapa penanda bahwa kita sudah melewati batas:

  • Butuh dua klausa for bersarang atau lebih dari satu klausa if.
  • Ekspresinya panjang sehingga baris terpaksa dipecah-pecah.
  • Badannya menimbulkan efek samping, misalnya print() atau menulis ke list lain di tengah pemrosesan.
  • Hasil antara perlu diperiksa langkah demi langkah saat menelusuri kesalahan.

Aturan praktisnya sederhana: comprehension untuk pola bersih “saring lalu ubah”, loop biasa untuk sisanya. Keduanya sama-sama Pythonic — yang tidak baik adalah memaksa satu bentuk untuk semua keadaan.

Referensi Resmi #

Rangkuman #

  • Bentuk dasar [hasil for elemen in sumber] membangun list baru dari transformasi tiap elemen; list sumber tidak berubah.
  • Klausa if di ekor menyaring elemen sebelum ditransformasi, dan keduanya bisa digabung dalam satu baris.
  • Loop biasa dan comprehension menghasilkan keluaran yang sama; pilih berdasarkan panjang logika dan keterbacaan, bukan gaya.
  • {kunci: nilai for ...} membangun dictionary baru dari pemetaan lama dengan pola baca yang identik.
  • Berhenti memakai comprehension ketika logikanya bersarang, panjang, atau mengandung efek samping — loop biasa lebih jujur untuk kasus itu.

Comprehension menghasilkan data di memori, tetapi data analisis yang sesungguhnya sering menunggu di luar program: berkas CSV hasil ekspor kasir, catatan teks, laporan bulanan. Chapter berikutnya, Pemrosesan File , mengajarkan cara membaca dan menulis berkas langsung dari Python bawaan.