Data hasil pengumpulan sering menyimpan nilai yang sama berkali-kali: email yang terdaftar dua kali, nama peserta yang terekam ganda, atau tag artikel yang berulang. Ketika kebutuhannya adalah keunikan — dan pertanyaan “apakah X sudah ada di dalam kumpulan ini?” — struktur data yang tepat adalah set. Set menyimpan setiap nilai hanya satu kali dan menolak duplikat secara otomatis.

Membuat Set dan Menghilangkan Duplikat #

Set dibuat dengan kurung kurawal atau dengan fungsi set() dari iterable apa pun. Ketika sumber datanya mengandung duplikat, Python otomatis menyisakan satu kemunculan saja.

python
buah = ["apel", "jeruk", "apel", "mangga", "jeruk"]
unik = set(buah)

print(sorted(unik))
print(len(unik))

kosong = {}
print(type(kosong))

set_kosong = set()
print(type(set_kosong))

Output yang Dihasilkan:

text
['apel', 'jeruk', 'mangga']
3
<class 'dict'>
<class 'set'>

Dari list berisi lima elemen (dua di antaranya duplikat), set(buah) hanya menyisakan tiga nilai unik. Perhatikan juga bahwa kita mencetak sorted(unik), bukan unik mentah — urutan internal set tidak dijamin, dan sorted() mengubahnya menjadi list terurut yang tampilannya selalu sama.

Menambah dan Menghapus Elemen #

Method add() memasukkan satu nilai; jika nilai tersebut sudah ada, set tidak berubah sama sekali. Untuk penghapusan ada dua method dengan perilaku berbeda: discard() diam saja ketika elemen tidak ditemukan, sedangkan remove() memunculkan KeyError.

python
peserta = {"budi", "siti"}
print(sorted(peserta))

peserta.add("agus")
print(sorted(peserta))

peserta.add("budi")  # duplikat otomatis diabaikan
print(sorted(peserta))

peserta.discard("siti")
print(sorted(peserta))

peserta.discard("zano")  # elemen tidak ada, discard tidak error
print(sorted(peserta))

Output yang Dihasilkan:

text
['budi', 'siti']
['agus', 'budi', 'siti']
['agus', 'budi', 'siti']
['agus', 'budi']
['agus', 'budi']

Baris peserta.add("budi") tidak menambah apa pun karena "budi" sudah tercatat. Bandingkan discard() dengan remove() pada contoh berikut:

python
>>> peserta = {"budi", "siti"}
>>> peserta.remove("zano")
Traceback (most recent call last):
  ...
KeyError: 'zano'

Gunakan remove() jika elemen yang hilang menandakan bug yang perlu diketahui, dan discard() saat ketidakhadiran elemen adalah kondisi normal.

Operasi Himpunan #

Kekuatan utama set adalah operasi matematika himpunan. Python menyediakan dua gaya penulisan yang setara: operator simbol dan nama method.

OperasiOperatorMethod
Gabungan (union)a | ba.union(b)
Irisan (intersection)a & ba.intersection(b)
Selisih (difference)a - ba.difference(b)

Ketiga operasi tersebut mengembalikan set baru tanpa mengubah operan aslinya.

python
tim_a = {"budi", "siti", "agus"}
tim_b = {"siti", "riri", "dewi"}

print(sorted(tim_a & tim_b))
print(sorted(tim_a | tim_b))
print(sorted(tim_a - tim_b))
print(sorted(tim_b - tim_a))

Output yang Dihasilkan:

text
['siti']
['agus', 'budi', 'dewi', 'riri', 'siti']
['agus', 'budi']
['dewi', 'riri']

Mari kita baca setiap baris hasil:

  1. Irisan tim_a & tim_b: hanya "siti" tergabung di kedua tim.
  2. Gabungan tim_a | tim_b: semua anggota kedua tim, masing-masing tercatat satu kali.
  3. Selisih tim_a - tim_b: anggota tim_a yang tidak ada di tim_b.
  4. Selisih tim_b - tim_a: kebalikannya — perhatikan bahwa operator - tidak komutatif.

Kapan Memakai Set #

Set menawarkan tiga keunggulan spesifik. Pertama, jaminan keunikan: duplikat tidak mungkin masuk. Kedua, pemeriksaan keanggotaan yang sangat cepat — operator in pada set jauh lebih cepat daripada pada list karena set mencari berdasarkan hash, bukan memindai elemen satu per satu. Ketiga, operasi himpunan siap pakai untuk membandingkan dua kelompok data.

Set juga punya batasan yang perlu diingat: set tidak mendukung index dan slicing, elemennya wajib hashable (list dan dictionary tidak boleh jadi elemen set), dan urutan isinya tidak dijamin. Analisis performa set versus list beserta panduan memilih struktur data akan kita bedah pada Chapter Memilih Struktur Data.