Kursus Python / Membuat list, dictionary, dan set dengan comprehension
Comprehension membuat kumpulan baru dengan mengubah unsur atau memilih unsur yang memenuhi kondisi. Gunakan untuk transformasi singkat yang mudah dibaca; pilih loop biasa jika pemrosesan membutuhkan beberapa langkah, penanganan kesalahan, atau efek samping.
Pisahkan transformasi dan penyaringan
Bentuk dasar list comprehension adalah [expression for item in source if condition]. Bagian for membaca unsur, if di belakang menyaring apakah unsur disertakan, dan ekspresi di depan menentukan nilai hasil untuk unsur yang lolos.
Ekspresi a if condition else b memiliki peran berbeda: ia memilih nilai untuk suatu unsur, bukan membuang unsur itu. Misalnya, label “dibayar” atau “gratis” dapat dipilih untuk setiap jumlah yang sudah lolos penyaringan. Tutorial list comprehension Python membandingkan sintaks ini dengan loop biasa.
Membuat wadah baru tidak otomatis menyalin seluruh objek di dalam sumber. Hasil yang memasukkan dictionary asli masih dapat berbagi dictionary tersebut. Sintaks comprehension sendiri tidak menghapus unsur dari wadah sumber, tetapi ekspresi yang Anda jalankan dapat memiliki efek samping; hindari menyembunyikan perubahan data di dalamnya.
Buat list, dictionary, dan set
Simpan kode lengkap berikut sebagai comprehensions.py dengan encoding UTF-8. Gunakan Python 3.12 atau lebih baru dan jalankan python comprehensions.py dari folder latihan menggunakan interpreter proyek. Semua data berada di skrip dan tidak memerlukan paket tambahan.
amounts = [3500, -1, 8000, 0]
valid = [x for x in amounts if x >= 0]
labels = ["paid" if x > 0 else "free" for x in valid]
records = [("food", 3500), ("bus", 2500)]
by_name = {name: amount for name, amount in records}
remainders = {x % 3 for x in valid}
print(valid)
print(labels)
print(by_name)
print(sorted(remainders))
Keluaran yang diharapkan:
[3500, 8000, 0]
['paid', 'paid', 'free']
{'food': 3500, 'bus': 2500}
[0, 2]
valid mempertahankan nilai yang lebih besar atau sama dengan nol, sehingga -1 dibuang tetapi 0 tetap ada. labels membuat satu label untuk setiap unsur valid: jumlah positif mendapat paid dan nol mendapat free. Jumlah label tetap sama dengan jumlah unsur valid karena kondisi berada di ekspresi pemilihan nilai, bukan filter.
by_name membentuk dictionary dari pasangan nama dan jumlah. remainders adalah set dari sisa pembagian tiga: 3500 dan 8000 sama-sama memberi sisa 2, sedangkan nol memberi sisa nol. Set hanya mempertahankan {0, 2}; sorted() membuat list terurut untuk tampilan.
Perhitungkan kunci dan nilai yang berulang
Dalam dictionary comprehension, nilai yang muncul belakangan untuk kunci yang sama menggantikan nilai sebelumnya. Bentuk {category: amount for ...} tidak menjumlahkan kategori berulang. Jika dua catatan food bernilai 3500 dan 4500, hasil akhirnya hanya menyimpan 4500 untuk kunci itu, bukan 8000. Gunakan loop akumulasi total dictionary jika kontribusi perlu digabung.
Set comprehension juga dapat mengurangi jumlah unsur karena nilai yang sama menjadi satu anggota. Hal ini sesuai untuk mencari nilai unik, tetapi bukan untuk mempertahankan jumlah transaksi. Pilih bentuk list, dictionary, atau set berdasarkan informasi yang dibutuhkan, seperti dalam contoh keanggotaan dan duplikat pada set.
Urutan pembacaan mengikuti klausa for. Sebagai contoh, [x * 2 for x in range(4) if x % 2 == 0] memilih nol dan dua, lalu menggandakannya menjadi [0, 4]. Untuk memahaminya, buat list hasil kosong, iterasikan rentang, periksa kondisi, lalu tambahkan nilai yang sudah diubah. Jika langkahnya menjadi sulit diikuti, pertahankan loop biasa. Referensi pembentukan list, set, dan dictionary merinci aturan evaluasinya.
Periksa hasil kosong dan efek samping
Jika semua unsur ditolak filter, list hasil menjadi kosong. Tentukan artinya sebelum mengambil indeks pertama atau membagi jumlah dengan panjangnya untuk rata-rata. Comprehension tidak otomatis menyediakan kebijakan untuk data kosong.
Jangan memakai list comprehension hanya untuk menjalankan print() atau menyimpan berkas: Anda akan membuat list hasil yang tidak diperlukan dan menyembunyikan tujuan utama tindakan. Loop for memperlihatkan efek samping secara langsung dan memberi tempat yang jelas untuk penanganan kesalahan per unsur.
- Ubah filter
x >= 0menjadix > 0. Nilai nol dan labelfreehilang, sehingga hasil valid menjadi[3500, 8000]dan label menjadi duapaid. Sisa yang ditampilkan hanya[2]. - Kembalikan filter, lalu tambahkan pasangan
("food", 4500)di akhirrecords. Nilaiby_name["food"]berubah menjadi4500; ini penggantian, bukan penjumlahan. - Pulihkan daftar catatan dan filter asli. Jalankan kembali serta cocokkan seluruh empat baris keluaran.
Pisahkan penyaringan, transformasi, dan agregasi dalam pikiran sebelum memadatkannya ke satu ekspresi. Bentuk yang lebih pendek berguna ketika aturannya tetap mudah diperiksa, bukan ketika jumlah baris saja berkurang.




