Set adalah kantong tak berurutan berisi item unik
Kalau list dan tuple peduli pada urutan, set tidak. Kalau list membiarkan duplikat menumpuk, set diam-diam membuangnya. Set adalah struktur data yang tepat saat kamu punya dua kebutuhan khusus:
- Kamu ingin item yang unik, titik.
- Kamu ingin memeriksa keanggotaan dengan cepat.
Tulis set dengan kurung kurawal:
"red" dan "green" yang dobel di set kedua langsung hilang. Itu bukan error, justru itulah intinya.
Membuat set
Dua cara yang benar-benar akan kamu pakai:
Poin terakhir itu pasti pernah menjebak semua orang: {} membuat dictionary kosong, bukan set kosong. Ambiguitas sintaksnya harus jatuh ke salah satu, dan dict yang menang.
Menambah dan menghapus
remove vs discard adalah perbedaan utamanya: remove mengharuskan item-nya ada; discard tidak peduli. Pilih berdasarkan apakah tidak adanya item itu seharusnya dianggap error.
Keanggotaan yang cepat
Di sinilah set benar-benar menunjukkan nilainya. x in some_set berjalan dalam waktu konstan, sebesar apa pun set-nya. x in some_list harus menelusuri list-nya, yang jadi lambat saat list-nya besar.
Aturan praktis: setiap kali kamu menulis if x in some_list di dalam loop, dan list-nya berisi lebih dari beberapa lusin item, ubah list itu menjadi set lebih dulu.
Matematika set
Di sinilah set jadi benar-benar menyenangkan. Kamu bisa menggabungkannya dengan operator yang mencerminkan operasi himpunan dalam matematika:
Setiap operator juga punya bentuk method (.union(), .intersection(), .difference(), .symmetric_difference()). Operatornya lebih ringkas; bentuk method-nya menerima iterable apa pun, bukan hanya set lain.
Menghapus duplikat dari list
Salah satu kegunaan set yang paling umum, bahkan di luar "logika himpunan":
Satu baris, duplikatnya hilang. Satu hal yang perlu dicatat: urutannya tidak dipertahankan. Kalau kamu butuh keunikan dan urutan asli, pakai dict.fromkeys() sebagai gantinya:
Dict mempertahankan urutan penyisipan di Python modern, dan dict.fromkeys membuat dict dengan item-item iterable sebagai key, sehingga hasilnya praktis seperti set yang berurutan.
Subset dan superset
Memeriksa apakah satu set termuat di set lain:
Hal ini muncul di kasus seperti pengecekan izin ("apakah pengguna ini punya semua role yang dibutuhkan?").
Apa saja yang bisa masuk ke set
Hanya item yang hashable. Itu istilah teknis; dalam praktiknya, artinya:
- Hal yang immutable itu hashable: angka, string, tuple berisi item hashable, frozenset.
- Hal yang mutable tidak: list, dict, dan set lain tidak bisa menjadi anggota set.
Kalau kamu butuh set berisi set, pakai frozenset, versi set yang immutable.
Iterasi tidak berurutan
Melakukan loop pada set memberimu item tanpa urutan yang dijamin:
Jalankan beberapa kali dan kamu akan melihat urutannya berubah-ubah. Kalau urutan penting, set bukan struktur yang tepat: urutkan isinya saat kamu membutuhkannya, atau pakai list.
Kapan tidak memakai set
Kalau salah satu hal ini berlaku, list atau dict mungkin lebih cocok:
- Kamu peduli pada urutan.
- Kamu perlu menyimpan duplikat.
- Setiap item punya data terkait (pakai dict dengan item itu sebagai key).
Lanjut
Set menangani keunikan dan keanggotaan. Dictionary, yang dibahas berikutnya, menangani pola yang lebih luas "cari nilai lewat key", yang mungkin merupakan struktur data selain list yang paling berguna di Python.
Pertanyaan yang sering diajukan
Apa itu set di Python?
Set adalah koleksi item unik yang tidak berurutan. Set memakai kurung kurawal tanpa pasangan key-value: colors = {'red', 'green', 'blue'}. Menambahkan nilai yang sama dua kali tidak berpengaruh apa-apa: duplikat dibuang diam-diam.
Kapan sebaiknya memakai set alih-alih list?
Pakai set saat kamu peduli pada keunikan atau saat kamu akan sering memeriksa keanggotaan (x in collection). Set otomatis menghapus duplikat dan memeriksa keanggotaan dalam waktu konstan, yang untuk koleksi besar jauh lebih cepat daripada list.
Bagaimana cara membuat set kosong di Python?
Pakai set(), bukan {}: kurung kurawal tanpa isi membuat dictionary kosong, bukan set kosong. Setelah punya set, kamu bisa menambah item dengan .add(value).