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:

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

text
[1, 4, 9, 16, 25]
[1, 4, 9, 16, 25]

Mari kita bedah versi comprehension pada bagian-bagian pentingnya:

  1. Baris 9 (kuadrat_comp = [n * n for n in angka]): interpreter menyiapkan list kosong baru, lalu mengambil elemen angka satu per satu.
  2. Ekspresi n * n: untuk setiap nilai n yang diambil, interpreter menghitung kuadratnya terlebih dahulu.
  3. Pengumpulan hasil: nilai hasil perhitungan ditambahkan ke list baru secara otomatis — peran append() sudah melekat pada sintaks.
  4. Akhir proses: list hasil diikat ke nama kuadrat_comp; list asal angka tidak 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:

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

text
[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:

BentukPosisi ifEfek
["genap" if n % 2 == 0 else "ganjil" for n in data]sebelum formemilih isi setiap elemen; jumlah elemen tetap
[n for n in data if n % 2 == 0]setelah formembuang elemen; jumlah elemen bisa berkurang

Kode berikut memperlihatkan keduanya berdampingan:

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

text
['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:

python
matriks = [
    [1, 2, 3],
    [4, 5, 6],
]

transpos = [[baris[i] for baris in matriks] for i in range(3)]
print(transpos)

Output yang Dihasilkan:

text
[[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.