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.
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:
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:
- Baris 3 (
round(n / 12, 1) for n in penjualan): untuk setiapndipenjualan, hasilkanround(n / 12, 1). Pembacaannya dimulai dari klausafor— “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. - Baris 6 (
n for n in penjualan if n > 130): klausaifdi ekor menyaring sebelum elemen dimasukkan, sehingga panjang hasil bisa lebih pendek dari sumbernya. Karena ekspresinya hanyan, 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.
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:
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:
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:
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? : TrueKeduanya benar; pilihan kita soal keterbacaan dan konteks. Ringkasan perbandingannya:
| Aspek | Loop biasa | List comprehension |
|---|---|---|
| Baris inti | Tiga baris: inisialisasi, perulangan, append | Satu baris |
| Kecocokan | Badan loop panjang, banyak kondisi, atau ada efek samping seperti print | Transformasi dan filter yang ringkas |
| Kesan baca | Eksplisit langkah demi langkah | Ringkas; 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:
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:
{'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
forbersarang atau lebih dari satu klausaif. - 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 #
- Python Tutorial: Data Structures — memuat bagian khusus tentang list comprehension beserta versi bersarangnya.
Rangkuman #
- Bentuk dasar
[hasil for elemen in sumber]membangun list baru dari transformasi tiap elemen; list sumber tidak berubah. - Klausa
ifdi 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.