Set adalah kumpulan yang setiap elemennya hanya muncul satu kali dan tidak memiliki urutan. Struktur ini menerjemahkan himpunan pada matematika ke dalam Python, lengkap dengan operasi union, intersection, dan difference. Topik ini membahas pembuatan set, mutasi elemennya, operasi himpunan tersebut, serta kebiasaan penulisan yang menjaga keluaran tetap mudah direproduksi.
Keunikan elemen pada set#
Literal set ditulis dengan tanda kurung kurawal berisi elemen-elemen yang dipisahkan tanda koma, mirip literal dictionary tanpa pasangan nilai. Duplikasi ditangani sejak pembuatan, sehingga nilai yang ditulis dua kali hanya tersimpan sekali. Fungsi len() menghitung elemen yang unik, dan uji keanggotaan dengan operator in berlangsung cepat karena berbasis tabel hash.
hewan = {"kucing", "burung", "kucing", "ikan"}
print(len(hewan))
print(sorted(hewan))
kosong = set()
print(type(kosong).__name__)
salah = {}
print(type(salah).__name__)3
['burung', 'ikan', 'kucing']
set
dictDari empat elemen yang ditulis, hanya tiga yang tersimpan karena kucing muncul dua kali. Fungsi sorted() dipanggil sebelum mencetak karena urutan iterasi set tidak ditentukan oleh bahasa Python, sehingga cetakan mentahnya dapat berbeda antarprogram. Literal kurung kurawal kosong justru membuat dictionary, dan set kosong harus dibuat dengan set().
Ketepatan memilih set datang dari dua sifatnya sekaligus, yaitu keunikan otomatis dan kecepatan uji keanggotaan. Kumpulan nilai yang tidak boleh ganda dan tidak bergantung pada urutan, seperti daftar nama hadirin atau kumpulan kata terlarang, sangat cocok disimpan sebagai set. Sebaliknya, data yang urutannya bermakna sebaiknya tetap berupa list, karena set tidak menyediakan indeks sama sekali.
Menambah dan menghapus elemen#
Mutasi set menggunakan tiga metode dengan perilaku yang berbeda. Metode add() menambahkan satu elemen baru, dan pemanggilan pada elemen yang sudah ada tidak mengubah apa pun. Metode remove() menghapus elemen yang dimaksud dan menimbulkan error KeyError bila elemen itu tidak ada, sedangkan metode discard() menghapus bila ada dan tidak melakukan apa pun bila tidak ada. Perbedaan terakhir ini berguna saat kehadiran suatu elemen memang tidak dapat dipastikan.
hewan = {"kucing", "burung"}
hewan.add("ikan")
hewan.add("kucing") # sudah ada, set tidak berubah
print(sorted(hewan))
hewan.remove("burung")
print(sorted(hewan))
hewan.discard("bebek") # tidak ada, tidak menimbulkan error
print(sorted(hewan))
try:
hewan.remove("bebek")
except KeyError as e:
print(type(e).__name__, str(e))['burung', 'ikan', 'kucing']
['ikan', 'kucing']
['ikan', 'kucing']
KeyError 'bebek'Empat keluaran di atas membentuk satu rangkaian yang berurutan. Penambahan kucing yang sudah ada tidak memunculkan duplikat, penghapusan burung menyusutkan set, pemanggilan discard() pada elemen yang tidak ada tidak meninggalkan keluaran, dan remove() pada elemen yang sama baru menimbulkan KeyError.
Menambah beberapa elemen sekaligus dapat dilakukan dengan update(), yang menerima iterable lain, yaitu objek yang dapat ditelusuri satu per satu seperti list atau set. Pada sisi penghapusan, pop() pada set tidak bekerja seperti pop() pada list, karena set.pop() menghapus elemen sembarang yang urutannya tidak dapat dipastikan. Untuk penghapusan terarah, tetap gunakan remove() atau discard() dengan nilai yang diketahui.
Operasi union, intersection, dan difference#
Operator | menghasilkan union, yaitu seluruh elemen milik kedua set. Operator & menghasilkan intersection, yaitu elemen yang dimiliki keduanya. Operator - menghasilkan difference, yaitu elemen milik set kiri yang tidak ada pada set kanan, sedangkan operator ^ menghasilkan symmetric difference, yaitu elemen yang hanya dimiliki salah satu. Metode bernama union(), intersection(), dan difference() menjalankan hal yang sama, tetapi bentuk operator lebih ringkas dan lebih umum digunakan.
piket_senin = {"Ali", "Budi", "Citra"}
piket_selasa = {"Budi", "Dewi"}
print(sorted(piket_senin | piket_selasa))
print(sorted(piket_senin & piket_selasa))
print(sorted(piket_senin - piket_selasa))
print(sorted(piket_senin ^ piket_selasa))['Ali', 'Budi', 'Citra', 'Dewi']
['Budi']
['Ali', 'Citra']
['Ali', 'Citra', 'Dewi']Jadwal piket dua hari itu menghasilkan empat jawaban yang berbeda. Seluruh anggota adalah empat orang, irisan hanya Budi, sisa piket Senin adalah Ali dan Citra, sedangkan symmetric difference menambahkan Dewi yang hanya terdaftar pada piket Selasa. Setiap cetakan tetap melalui sorted() karena operasi tersebut tidak menjamin urutan hasilnya.
Perbandingan menyeluruh antar set juga tersedia. Operator <= menguji subset, yaitu seluruh elemen set kiri terkandung pada set kanan, sedangkan operator >= menguji superset, yaitu seluruh elemen set kanan terkandung pada set kiri. Kedua uji ini sering digunakan untuk memastikan cakupan, misalnya memeriksa bahwa seluruh anggota satu tim terdaftar pada jadwal piket.
Menghapus duplikat dan menguji keanggotaan#
Konversi list menjadi set adalah cara paling ringkas untuk menghapus duplikat, cukup dengan set(data). Konsekuensinya, urutan asli list hilang, sehingga bila urutan masih dibutuhkan, hasilnya diurutkan kembali dengan sorted(). Setelah duplikat hilang, pengujian keanggotaan berlangsung cepat karena berbasis hash dan bukan penelusuran satu per satu.
kata = "satu dua tiga dua satu".split()
unik = set(kata)
print(len(kata), len(unik))
print("tiga" in unik)
print(sorted(unik))5 3
True
['dua', 'satu', 'tiga']Lima kata terbagi atas tiga kata yang unik. Uji "tiga" in unik mengembalikan True tanpa memandang urutan, dan cetakan terakhir menampilkan isi set dalam keadaan terurut. Pola ini tepat untuk data berupa kumpulan tanpa makna urutan, misalnya daftar nama hadirin.
Satu catatan tentang konversi balik, yaitu list(unik) mengembalikan list berisi elemen set dengan urutan yang tidak dapat dipastikan. Apabila urutan kemunculan pertama perlu dipertahankan, dict.fromkeys(kata) menyaring duplikat sambil menjaga urutan, lalu dikonversi kembali dengan list(...). Pemilihan pola ini bergantung pada pertanyaan sederhana, yaitu apakah urutan kemunculan setiap nilai masih bermakna atau tidak.
Kesalahan umum#
Kesalahan pertama adalah menaruh elemen yang tidak bersifat hashable, misalnya list, ke dalam set. Penyusunan internalnya menuntut nilai hash yang tetap, sehingga elemen semacam itu ditolak dengan error TypeError.
try:
s = {1, [2, 3]}
except TypeError as e:
print(type(e).__name__, str(e))TypeError unhashable type: 'list'Perbaikannya adalah menyimpan tuple (2, 3) alih-alih list, karena tuple memenuhi syarat hashable. Aturan yang sama berlaku pada kunci dictionary, karena keduanya berbagi mekanisme tabel hash.
Kesalahan kedua adalah mengandalkan urutan cetakan set yang mentah. Karena urutan iterasinya tidak ditentukan, pemanggilan print(hewan) tanpa sorted() dapat tampak berbeda antar eksekusi, bahkan pada program yang sama. Kebiasaan yang aman adalah selalu menampilkan isi set melalui sorted() atau len(). Fungsi sorted() mengembalikan list yang terurut, sehingga hasilnya boleh disimpan ke variabel bila urutan tetap dibutuhkan.
Kesalahan ketiga adalah memilih remove() pada elemen yang mungkin tidak ada. Apabila ketiadaan elemen merupakan keadaan yang wajar, metode discard() menghindarkan program dari KeyError yang tidak perlu.
Ringkasan#
- Set menyimpan elemen unik tanpa urutan, dengan literal kurung kurawal untuk set berisi elemen dan
set()untuk set kosong. - Metode
add(),remove(), dandiscard()mengurus mutasi, dengan perbedaan perilaku ketika elemen yang dimaksud tidak ada. - Operator
|,&,-, dan^menghasilkan union, intersection, difference, dan symmetric difference antar set. - Hasil set sebaiknya dicetak melalui
sorted()karena urutan iterasinya tidak ditentukan oleh bahasa.
Referensi#
- Sets — Python Software Foundation — Bagian tutorial resmi tentang pembuatan set dan operasi himpunannya.
- Set Types (set, frozenset) — Python Software Foundation — Referensi lengkap tipe set beserta metode dan operatornya.