List comprehension adalah cara membuat list baru dari list lain dalam satu baris: tiap item diambil, boleh disaring dulu dengan if, lalu diubah jadi nilai baru. Bayangin Pak Darto mau menaikkan harga di Warung Kopi-nya. Dia ambil kertas daftar harga lama, lalu menyalin tiap harga ke kertas baru sambil menambah 2.000. Kalau dia cuma mau menu yang murah, harga yang mahal dia lewati. Kertas lamanya gak dicoret: hasilnya selalu kertas baru.
🧪 Tebakan cepat:
harga = [15000, 5000, 12000], laluprint([h + 2000 for h in harga if h < 13000]). Apa yang tercetak? Tebak dulu, jawabannya ada di bagian "Menyaring dengan if".
Dari for loop ke comprehension
Dengan for loop dari pelajaran sebelumnya, menaikkan semua harga butuh empat baris:
harga = [15000, 5000, 12000]
naik = []
for h in harga:
naik.append(h + 2000)
print(naik) # [17000, 7000, 14000]
List comprehension menulis hal yang sama dalam satu baris:
harga = [15000, 5000, 12000]
naik = [h + 2000 for h in harga]
print(naik) # [17000, 7000, 14000]
print(harga) # [15000, 5000, 12000]
- Bentuknya
[ekspresi for item in iterable]. Baca dari tengah: "untuk tiaphdiharga, masukkanh + 2000". - Iterable adalah apa saja yang bisa ditelusuri dengan
for: list, string,range(...), atau dictionary. - Kurung siku di luar artinya hasilnya list baru. List asli,
harga, gak berubah. - Ekspresi di depan boleh apa saja:
h * 2,h ** 2(pangkat dua, dari pelajaran operator), atau method sepertim.upper().
Menyaring dengan if
Tambahkan if kondisi di belakang untuk menyaring item:
harga = [15000, 5000, 12000]
murah = [h for h in harga if h < 13000]
print(murah) # [5000, 12000]
print([h + 2000 for h in harga if h < 13000]) # [7000, 14000]
h |
h < 13000 |
Yang masuk ke list baru |
|---|---|---|
| 15000 | False | dilewati |
| 5000 | True | 5000 + 2000 = 7000 |
| 12000 | True | 12000 + 2000 = 14000 |
- Tiap item dicek dulu. Yang kondisinya
Falsedilewati, ekspresinya gak dihitung sama sekali. - Yang lolos dihitung ekspresinya, lalu masuk ke list baru sesuai urutan aslinya.
- Jadi yang tercetak
[7000, 14000]: 15000 tersaring, sisanya ditambah 2000. Itu jawaban tebakannya.
Dengan range dari pelajaran for loop, comprehension bisa membuat deret angka. range(6) adalah 0 sampai 5, dan x % 2 == 0 artinya genap:
print([x * 3 for x in range(6) if x % 2 == 0]) # [0, 6, 12]
print([x ** 2 for x in range(1, 6)]) # [1, 4, 9, 16, 25]
- Baris pertama:
xdari 0 sampai 5, yang genap cuma 0, 2, 4, lalu tiap angka dikali 3. range(1, 6)mulai dari 1 dan berhenti sebelum 6. Untuk 1 sampai 10, tulisrange(1, 11).- Ganjil kebalikannya:
x % 2 != 0.
Mengubah teks
pesanan = ["kopi susu", "teh manis", "roti bakar"]
print([m.upper() for m in pesanan]) # ['KOPI SUSU', 'TEH MANIS', 'ROTI BAKAR']
print([len(m) for m in pesanan]) # [9, 9, 10]
print([m.upper() for m in pesanan if "a" in m]) # ['TEH MANIS', 'ROTI BAKAR']
m.upper()dipanggil untuk tiap item, jadi semua nama jadi huruf kapital semua.len(m)menghitung panjang tiap nama.if "a" in mmenyaring nama yang mengandung hurufa.kopi susugak punya, jadi tersaring.
📌 Memilih nilai dengan if-else
if di belakang menyaring. Kalau kamu mau semua item tetap masuk, tapi nilainya dipilih, tulis if ... else di depan, sebagai bagian dari ekspresi:
harga = [15000, 5000, 12000]
label = ["murah" if h < 10000 else "mahal" for h in harga]
print(label) # ['mahal', 'murah', 'mahal']
Posisinya menentukan artinya. else di belakang ditolak, dan Python gak menjalankan satu baris pun:
File "/home/darto/warung.py", line 2
hasil = [h for h in harga if h < 10000 else 0]
^^^^
SyntaxError: invalid syntax
📌 Dictionary comprehension
Dengan kurung kurawal dan key: value, hasilnya dictionary:
pesanan = ["kopi susu", "teh manis", "roti bakar"]
print({m: len(m) for m in pesanan}) # {'kopi susu': 9, 'teh manis': 9, 'roti bakar': 10}
Kurung kurawal tanpa titik dua, seperti {h // 1000 for h in harga}, membuat set.
⚠️ Jebakan yang sering ketemu
elsedi saringan belakang.[h for h in harga if h < 10000 else 0]adalahSyntaxError: invalid syntax. Saringan gak punyaelse. Untuk memilih nilai, pindahkanif ... elseke depanfor.- Memakai variabel loop di luar. Sesudah
naik = [h + 2000 for h in harga],print(h)gagal denganNameError: name 'h' is not defined.hcuma hidup di dalam kurung siku. - Comprehension untuk mencetak.
[print(m) for m in pesanan]memang mencetak, tapi juga membuat list[None, None, None]yang gak terpakai. Untuk mencetak atau langkah yang panjang, pakai for biasa. - Batas
rangemeleset satu.range(1, 10)berhenti di 9. Angka 1 sampai 10 adalahrange(1, 11).
TL;DR: List comprehension [ekspresi for item in iterable] membuat list baru dalam satu baris dan gak mengubah list aslinya: [h + 2000 for h in harga]. Tambahkan if kondisi di belakang untuk menyaring: item yang False dilewati, jadi [h + 2000 for h in harga if h < 13000] adalah [7000, 14000] dan [x * 3 for x in range(6) if x % 2 == 0] adalah [0, 6, 12]. Ekspresinya boleh method: [m.upper() for m in pesanan] membuat semua nama jadi huruf kapital. Untuk memilih nilai, if ... else ditulis di depan for; else di belakang adalah SyntaxError. Kurung kurawal dengan key: value membuat dictionary.