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:

python
kata = ["apel", "jeruk", "mangga", "pisang"]

panjang_kata = {len(k) for k in kata}
print(sorted(panjang_kata))

Output yang Dihasilkan:

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

  1. Baris 3 ({len(k) for k in kata}): interpreter mengambil setiap kata k dari list kata.
  2. Ekspresi len(k): setiap kata dihitung panjangnya, menghasilkan deretan nilai 4, 5, 6, 6.
  3. Penyimpanan ke set: nilai 6 yang datang kedua ditolak karena set sudah memuat 6; set tidak pernah menyimpan dua elemen yang dianggap sama.
  4. 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:

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

text
['backend', 'python', 'web']
6 elemen mentah -> 3 elemen unik

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

python
kalimat = "Belajar Python itu menyenangkan"

vokal = {ch.lower() for ch in kalimat if ch.lower() in "aeiou"}
print(sorted(vokal))

Output yang Dihasilkan:

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

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

text
[1, 2, 3, 4, 5, 6, 9]
[1, 2, 3, 4, 5, 6, 9]
True

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

AspekList comprehensionSet comprehension
Pembatas[ dan ]{ dan }
Duplikatdipertahankan semuaotomatis dibuang
Urutan hasilmengikuti urutan sumbertidak dijamin
Pengambilan elemenbisa diindeks (hasil[0])harus diiterasi
python
>>> type({})
<class 'dict'>
>>> type(set())
<class 'set'>