Banyak pekerjaan pengolahan data berpola sama: ambil sebuah koleksi, ubah setiap elemennya, lalu kumpulkan hasilnya ke dalam list baru. Pada Chapter Iterasi Collections kita menulis pola tersebut dengan loop for plus list.append() sepanjang tiga sampai empat baris. List comprehension memampatkan pola yang sama menjadi satu ekspresi — gaya penulisan khas Python yang akan kita jumpai di hampir semua codebase nyata.
Sintaks Dasar #
List comprehension ditulis di dalam tanda kurung siku dengan bentuk umum [ekspresi for item in iterable]. Interpreter Python membaca bentuk ini hampir seperti kalimat: “bangun list yang berisi hasil ekspresi, untuk setiap item di dalam iterable”. Di balik layar, comprehension tetap menjalankan loop — kita hanya tidak perlu lagi menulis append() secara eksplisit.
Perbandingan berikut menunjukkan dua bentuk yang menghasilkan list identik:
angka = [1, 2, 3, 4, 5]
# Versi 1: loop eksplisit dengan append
kuadrat_loop = []
for n in angka:
kuadrat_loop.append(n * n)
# Versi 2: list comprehension
kuadrat_comp = [n * n for n in angka]
print(kuadrat_loop)
print(kuadrat_comp)Output yang Dihasilkan:
[1, 4, 9, 16, 25]
[1, 4, 9, 16, 25]Mari kita bedah versi comprehension pada bagian-bagian pentingnya:
- Baris 9 (
kuadrat_comp = [n * n for n in angka]): interpreter menyiapkan list kosong baru, lalu mengambil elemenangkasatu per satu. - Ekspresi
n * n: untuk setiap nilainyang diambil, interpreter menghitung kuadratnya terlebih dahulu. - Pengumpulan hasil: nilai hasil perhitungan ditambahkan ke list baru secara otomatis — peran
append()sudah melekat pada sintaks. - Akhir proses: list hasil diikat ke nama
kuadrat_comp; list asalangkatidak pernah diubah.
Transformasi dan Penyaringan #
Comprehension bisa melakukan dua jenis pekerjaan sekaligus. Transformasi mengubah nilai setiap elemen; penyaringan (filter) membuang elemen yang tidak lolos syarat. Klausa if yang diletakkan di bagian belakang bertugas sebagai filter:
harga = [150000, 85000, 320000, 99000]
# Penyaringan: hanya harga >= 100000
mahal = [h for h in harga if h >= 100000]
print(mahal)
# Penyaringan + transformasi sekaligus
mahal_diskon = [round(h * 0.95) for h in harga if h >= 100000]
print(mahal_diskon)Output yang Dihasilkan:
[150000, 320000]
[142500, 304000]Pada baris 8, urutan pengerjaan per elemen adalah: cek klausa if h >= 100000 lebih dulu; jika lolos, hitung round(h * 0.95); jika tidak lolos, elemen diabaikan sama sekali. Dua harga di bawah 100000 tidak pernah tersentuh perhitungan diskon.
Klausa if versus Conditional Expression #
Python mengenal conditional expression dengan bentuk x if kondisi else y — versi satu baris dari if/else yang langsung menghasilkan nilai. Di dalam comprehension, penempatan if mengubah maknanya:
| Bentuk | Posisi if | Efek |
|---|---|---|
["genap" if n % 2 == 0 else "ganjil" for n in data] | sebelum for | memilih isi setiap elemen; jumlah elemen tetap |
[n for n in data if n % 2 == 0] | setelah for | membuang elemen; jumlah elemen bisa berkurang |
Kode berikut memperlihatkan keduanya berdampingan:
angka = [1, 2, 3, 4, 5]
# Conditional expression: setiap elemen tetap ikut, nilainya yang dipilih
label = ["genap" if n % 2 == 0 else "ganjil" for n in angka]
print(label)
# Klausa filter: elemen yang tidak lolos syarat dibuang
genap_saja = [n for n in angka if n % 2 == 0]
print(genap_saja)Output yang Dihasilkan:
['ganjil', 'genap', 'ganjil', 'genap', 'ganjil']
[2, 4]List label tetap berisi lima elemen karena if ... else hanya menentukan isi tiap posisi. Sebaliknya, list genap_saja hanya berisi dua elemen karena klausa if di belakang for benar-benar membuang elemen ganjil.
Comprehension Bersarang #
Comprehension boleh berisi comprehension lain — berguna untuk data berdimensi dua seperti matriks. Contoh klasiknya adalah transpose, menukar baris menjadi kolom:
matriks = [
[1, 2, 3],
[4, 5, 6],
]
transpos = [[baris[i] for baris in matriks] for i in range(3)]
print(transpos)Output yang Dihasilkan:
[[1, 4], [2, 5], [3, 6]]Cara membacanya dimulai dari comprehension terluar: for i in range(3) mengambil nomor kolom 0, 1, 2. Untuk setiap nilai i, comprehension terdalam [baris[i] for baris in matriks] berjalan menuruni tiap baris sambil mengambil elemen pada kolom ke-i — menghasilkan [1, 4], lalu [2, 5], lalu [3, 6].
Dengan pola ini, kita siap mempelajari dua saudara list comprehension: set comprehension dan dictionary comprehension pada chapter berikutnya.