Soal 1Apa yang dicetak kode ini?nums = [1, 2, 3, 4]
result = [n * 10 for n in nums]
print(result)
List Comprehension dan Dict / Set / Generator Expression — Bangun Koleksi dalam Satu Baris
Pelajari comprehension Python untuk membangun list, dict, dan set hanya dalam satu baris.
Di artikel sebelumnya tentang all() / any(), kamu sudah melihat cara menilai seluruh koleksi sekaligus. Kali ini, kamu akan melangkah lebih jauh dan melihat sintaks ampuh untuk membangun koleksi itu sendiri dalam satu baris — comprehension.
Kita mulai dari list comprehension, menambahkan filter dengan if, melihat varian dict dan set, dan menutup dengan generator expression yang hemat memori.
Dasar List Comprehension — Padatkan Loop for ke Satu Baris
Python punya sintaks satu baris untuk membangun list: [ekspresi for variabel in iterable]. Ini disebut list comprehension.
Ini adalah shortcut untuk pola loop for yang dimulai dengan list kosong dan memanggil append() berulang kali, dan ia bersinar ketika kamu ingin menerapkan transformasi yang sama ke setiap elemen dan menghasilkan list baru.
[ekspresi for variabel in iterable] menghasilkan list baru dengan setiap elemen ditransformasikan oleh ekspresi. Ini adalah versi satu baris dari menulis loop for dengan append.
# Memakai loop for
result = []
for price in [100, 250, 480]:
result.append(int(price * 1.1))
print(result) # [110, 275, 528]
# Hal yang sama sebagai list comprehension
prices = [100, 250, 480]
tax_included = [int(p * 1.1) for p in prices]
print(tax_included) # [110, 275, 528]
# Mengumpulkan panjang string juga dalam satu baris
names = ["Alice", "Bob", "Charlotte"]
lengths = [len(n) for n in names]
print(lengths) # [5, 3, 9]
Memfilter dengan if — Comprehension Bersyarat
Tambahkan if kondisi setelah for dan hanya elemen yang memenuhi kondisi yang masuk ke list baru. Bentuknya adalah [ekspresi for variabel in iterable if kondisi].
Menulis transformasi dan filter pada baris yang sama adalah hal yang membuat list comprehension ringkas — menarik keluar "hanya elemen yang cocok" menjadi satu baris pendek dan mudah dibaca.
if p >= 200 satu per satu. Elemen True (disimpan) berakhir di list baru; elemen False (dilewati) dibuang.# Tarik hanya item >= 200
prices = [80, 250, 120, 480, 95]
premium = [p for p in prices if p >= 200]
print(premium) # [250, 480]
# Filter dan transformasi sekaligus
discounted = [int(p * 0.9) for p in prices if p >= 200]
print(discounted) # [225, 432] ← diskon 10%, hanya item >= 200
# Filter dan transformasi pada string
names = ["Alice", "Bob", "Charlotte", "Ed"]
long_names = [n.upper() for n in names if len(n) >= 5]
print(long_names) # ['ALICE', 'CHARLOTTE']
Dict Comprehension dan Set Comprehension
Tukar tanda kurung siku [ ] dari list comprehension dengan kurung kurawal { } dan kamu mendapatkan set comprehension.
Selangkah lebih jauh dengan {key: value for ...} dan titik dua mengubahnya menjadi dict comprehension. Sintaks for ... in ... identik — hanya bentuk koleksi outputnya yang berubah, dan fleksibilitas itulah yang membuat comprehension begitu praktis.
{key: value for ...} membangun dict berisi pasangan. Dari list tuple (name, price) kamu bisa membangun lookup "name → price" dalam satu baris.
# Dict comprehension: bangun lookup name → price
pairs = [("apel", 120), ("jeruk", 80), ("pisang", 60)]
price_lookup = {name: price for name, price in pairs}
print(price_lookup)
# {'apel': 120, 'jeruk': 80, 'pisang': 60}
# Bangun ulang dict dengan harga termasuk pajak
tax_included = {name: int(price * 1.1) for name, price in pairs}
print(tax_included)
# {'apel': 132, 'jeruk': 88, 'pisang': 66}
# Set comprehension: tarik tag unik (tanpa duplikat)
tags = ["sale", "new", "sale", "limited", "new"]
unique = {t for t in tags}
print(unique) # {'sale', 'new', 'limited'} (urutan tergantung implementasi)
Pasangkan zip() dengan dict comprehension
Saat kamu punya dua list paralel seperti names dan prices dan ingin sebuah dict, {n: p for n, p in zip(names, prices)} sangat cocok. zip() berjalan menyusuri list secara paralel sehingga kamu bisa membangun key dan value pada saat yang sama.
Generator Expression — Tukar Kurung Siku dengan Kurung Biasa
Tukar tanda kurung siku [ ] dari list comprehension dengan tanda kurung ( ) dan kamu punya generator expression. Tidak seperti list, ia tidak memuat semua elemen di memori — ia menghitung hanya yang kamu butuhkan, ketika kamu butuhkan (lazy evaluation).
Kamu bisa meneruskannya langsung ke sum() / max() / min() / any() dan seterusnya, yang menjaga penggunaan memori tetap rendah saat mengagregasi data besar. Pendalaman lengkapnya ada di artikel generator function nanti.
| Sintaks | Tipe hasil | Karakteristik |
|---|---|---|
| [x for x in items] | list | Menyimpan semua item di memori |
| {x for x in items} | set | Tanpa duplikat, semua di memori |
| {k: v for k, v in items} | dict | Pasangan key: value, semua di memori |
| (x for x in items) | generator | Hanya item saat ini, lazy |
# Tanda kurung membuat generator expression
prices = [100, 250, 480, 1200]
gen = (int(p * 1.1) for p in prices)
print(type(gen)) # <class 'generator'>
# Teruskan langsung ke sum() (kurung luar bisa dihilangkan)
total_tax = sum(int(p * 1.1) for p in prices)
print(total_tax) # 2233
# Trik yang sama dengan max() / min()
max_tax = max(int(p * 1.1) for p in prices)
print(max_tax) # 1320
Pilih sesuai kasus penggunaan: "semua sekaligus?" atau "satu per satu?"
Jika kamu ingin seluruhnya sebagai list di tanganmu, gunakan [ ] (list comprehension). Jika kamu hanya meneruskannya ke sum() / max() untuk mengagregasi, ( ) (generator expression) adalah pilihan yang lebih ramah memori. Pada skala satu juta elemen, perbedaannya dramatis — generator expression hanya menggunakan beberapa ratus byte saja.
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Apa yang dicetak kode ini?nums = [1, 2, 3, 4, 5]
result = [n for n in nums if n % 2 == 0]
print(result)
Soal 3Mana di antara berikut yang membuat dict?