Data duplikat ada di mana-mana: tag artikel yang berulang, kategori produk yang sama, atau ID transaksi yang tercatat berkali-kali. Sering kali langkah pertama pengolahan data adalah mengambil daftar nilai unik saja. Pada Chapter Set kita sudah mengenal struktur data yang otomatis menolak duplikat; sekarang kita akan membangun set tersebut langsung dari sumbernya memakai set comprehension — membangun sekaligus mendeduplikasi dalam satu ekspresi.
Sintaks dan Deduplikasi #
Set comprehension ditulis di dalam kurung kurawal dengan bentuk umum {ekspresi for item in iterable}. Bedanya dengan list comprehension hanya pada pembatas: hasil akhirnya berupa set, sehingga setiap nilai yang sama akan menyatu menjadi satu.
Bentuk paling sederhana mengubah setiap elemen menjadi ukuran lain, lalu mengambil nilai uniknya:
kata = ["apel", "jeruk", "mangga", "pisang"]
panjang_kata = {len(k) for k in kata}
print(sorted(panjang_kata))Output yang Dihasilkan:
[4, 5, 6]Empat kata tersebut memiliki panjang 4, 5, 6, dan 6 — panjang 6 yang muncul dua kali hanya tersimpan sekali. Mari kita bedah prosesnya:
- Baris 3 (
{len(k) for k in kata}): interpreter mengambil setiap katakdari listkata. - Ekspresi
len(k): setiap kata dihitung panjangnya, menghasilkan deretan nilai4, 5, 6, 6. - Penyimpanan ke set: nilai
6yang datang kedua ditolak karena set sudah memuat6; set tidak pernah menyimpan dua elemen yang dianggap sama. - Baris 4 (
sorted(...)): isi set dicetak dalam urutan naik agar hasilnya pasti sama di semua komputer.
Kasus penggunaan yang paling umum adalah deduplikasi mentah dari data yang penuh pengulangan:
tag_mentah = ["python", "web", "python", "backend", "web", "python"]
tag_unik = {t for t in tag_mentah}
print(sorted(tag_unik))
print(len(tag_mentah), "elemen mentah ->", len(tag_unik), "elemen unik")Output yang Dihasilkan:
['backend', 'python', 'web']
6 elemen mentah -> 3 elemen unikEnam elemen mentah selesai dipadatkan menjadi tiga tag unik, tanpa loop manual dan tanpa memeriksa if t not in hasil.
Penyaringan dengan if #
Sama seperti list comprehension, klausa if di bagian belakang membuang elemen yang tidak lolos syarat sebelum elemen tersebut masuk ke set:
kalimat = "Belajar Python itu menyenangkan"
vokal = {ch.lower() for ch in kalimat if ch.lower() in "aeiou"}
print(sorted(vokal))Output yang Dihasilkan:
['a', 'e', 'i', 'o', 'u']Kalimat tersebut memiliki huruf vokal yang berulang banyak kali, tetapi hasil akhirnya hanya lima huruf unik. Perhatikan bahwa sorted() tetap dipakai saat mencetak — urutan internal set bukan jaminan dan boleh berbeda antar program, meski isinya selalu sama.
Set Comprehension versus Konstruktor set() #
Konstruktor set() juga bisa mendeduplikasi, jadi kapan memilih comprehension? Aturannya sederhana: comprehension unggul saat kita perlu mengubah setiap elemen di tengah jalan; konstruktor hanya mengonversi koleksi apa adanya.
sumber = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]
dari_comprehension = {n for n in sumber}
dari_constructor = set(sumber)
print(sorted(dari_comprehension))
print(sorted(dari_constructor))
print(dari_comprehension == dari_constructor)Output yang Dihasilkan:
[1, 2, 3, 4, 5, 6, 9]
[1, 2, 3, 4, 5, 6, 9]
TrueKetika ekspresi hanya menyalin elemen apa adanya (n for n in sumber), kedua cara menghasilkan set yang sama persis. Begitu ekspresinya berubah — misalnya {len(k) for k in kata} atau {n % 3 for n in sumber} — konstruktor set() tidak lagi bisa menggantikannya tanpa loop perantara.
Perbandingan ringkas dengan list comprehension:
| Aspek | List comprehension | Set comprehension |
|---|---|---|
| Pembatas | [ dan ] | { dan } |
| Duplikat | dipertahankan semua | otomatis dibuang |
| Urutan hasil | mengikuti urutan sumber | tidak dijamin |
| Pengambilan elemen | bisa diindeks (hasil[0]) | harus diiterasi |
>>> type({})
<class 'dict'>
>>> type(set())
<class 'set'>