2.10. Set¶
Sebuah set adalah koleksi item unik yang tidak terurut. Menambahkan nilai yang sudah ada tidak berpengaruh; iterasi menghasilkan setiap nilai tepat satu kali. Set adalah alat yang tepat ketika keanggotaan dan penghapusan duplikat penting, dan urutan tidak penting.
2.10.1. Membuat set¶
Gunakan kurung kurawal untuk set yang tidak kosong, atau set() untuk yang kosong:
colours = {"red", "green", "blue"}
empty = set()
Kurung kurawal terlihat seperti literal dict; {} sendiri adalah dict kosong, bukan set kosong -- salah satu kecelakaan historis Python. Gunakan set() untuk kasus kosong.
set() juga membangun set dari iterable apa pun, yang merupakan cara standar untuk menghapus duplikat dari sebuah urutan:
nums = [1, 2, 2, 3, 1, 4]
unique = set(nums)
print(unique)
Output:
{1, 2, 3, 4}
Urutan print mungkin bervariasi -- set tidak menjanjikan iterasi dalam urutan tertentu.
2.10.2. Set vs dict¶
Set dan dict keduanya menyimpan item unik dalam tabel hash. Perbedaannya adalah apa yang dibawa setiap item:
dictmenyimpan pasangan kunci-nilai. Mencari kunci mengembalikan nilainya.setmenyimpan hanya item tersebut. Mencari item memberitahu Anda apakah item tersebut ada.
Pilihan antara keduanya bergantung pada apakah nilai di samping setiap item bermakna:
Gunakan set ketika tidak ada nilai yang perlu disandingkan dengan setiap item -- Anda hanya peduli apakah item tersebut ada, atau Anda menggabungkan grup item unik dengan union / intersection.
Gunakan dict ketika setiap item dipasangkan dengan data yang ingin diambil oleh pencarian -- peta konfigurasi, cache, penghitung berdasarkan nama.
Kedua tipe berbagi banyak sintaks permukaan, yang menjadi sumber kebingungan terbesar. Perbedaannya dalam satu blok:
set |
dict |
|
|---|---|---|
menampung |
item unik |
kunci unik, masing-masing dengan nilai |
literal terisi |
|
|
literal kosong |
|
|
uji keanggotaan |
|
|
ambil nilai |
n/a |
|
tambah item |
|
|
iterasi |
menghasilkan item |
menghasilkan kunci (gunakan |
Asimetri antara literal terisi dan literal kosong adalah hal yang perlu diperhatikan:
Kurung kurawal dengan item di dalamnya --
{1, 2, 3}-- adalah literal set; kurung kurawal dengan pasangan kunci-nilai --{"a": 1}-- adalah literal dict. Parser membedakannya berdasarkan apa yang ada di dalamnya.Kurung kurawal dengan tidak ada di dalamnya --
{}-- adalah dict kosong, bukan set kosong. Dict hadir lebih dulu; literal kosong milik mereka. Set kosong tidak memiliki literal kurung kurawal sama sekali dan harus ditulisset().
Pola umum ketika hanya kunci dict yang pernah dibaca adalah beralih ke set -- ini membuat maksudnya jelas dan menghapus nilai yang tidak terpakai dari memori.
2.10.3. Menambah dan menghapus¶
set.add()-- menyisipkan satu item.set.discard()-- menghapus item jika ada, tidak melakukan apa pun jika tidak ada.set.remove()-- menghapus item; memunculkanKeyErrorjika tidak ada.set.clear()-- mengosongkan set.
s = {1, 2, 3}
s.add(4)
s.discard(99) # silent: 99 not in s
s.remove(2)
print(s)
Output:
{1, 3, 4}
2.10.4. Keanggotaan¶
Operator in menguji keanggotaan. Pada set, operasi ini kurang lebih konstan waktunya terlepas dari ukurannya -- yang merupakan alasan utama untuk memilih set daripada list ketika Anda hanya perlu bertanya "apakah nilai ini ada di sini":
if "red" in colours:
print("colour is allowed")
list dengan isi yang sama akan memindai dari awal setiap kali, yang baik-baik saja untuk sepuluh item tetapi lambat untuk sepuluh ribu.
2.10.5. Operasi set¶
Dua set dapat digabungkan dengan operasi matematika biasa. Masing-masing memiliki bentuk operator dan bentuk metode:
a | bataua.union(b)-- semua yang ada di salah satu set.a & bataua.intersection(b)-- hanya yang muncul di keduanya.a - bataua.difference(b)-- ada diatapi tidak dib.a ^ bataua.symmetric_difference(b)-- ada di satu tapi tidak keduanya.
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b)
print(a & b)
print(a - b)
print(a ^ b)
Output:
{1, 2, 3, 4, 5, 6}
{3, 4}
{1, 2}
{1, 2, 5, 6}
Bentuk operator bersifat read-only; bentuk metode menerima iterable apa pun di sebelah kanan, bukan hanya set lain (a.union([5, 6])). Pilih mana yang lebih mudah dibaca dalam konteksnya.
2.10.6. Apa yang bisa masuk ke dalam set¶
Elemen set harus hashable -- batasan yang sama dengan kunci dict. int, float, str, bool, bytes, dan tuple (ketika isinya sendiri hashable) semuanya berfungsi. list dan dict tidak; mencoba menambahkan salah satunya akan memunculkan TypeError.
2.10.7. frozenset¶
Sebuah set biasa bersifat mutable: setiap panggilan ke add / remove / discard mengubah objek di tempat. Mutabilitas tersebut mendiskualifikasinya dari being hashable, sehingga set tidak dapat digunakan sebagai kunci dict atau sebagai anggota set lain.
frozenset adalah pasangan immutable-nya. Ia memiliki pencarian dan operator yang sama (in, |, &, -, ^) seperti set, tetapi tidak ada add / remove dan tidak ada metode yang melakukan mutasi. Karena tidak ada yang dapat mengubah isinya, hash dari frozenset terdefinisi dengan baik -- sehingga ia adalah hashable:
primary = frozenset({"red", "green", "blue"})
secondary = frozenset({"yellow", "purple", "orange"})
palettes = {
primary: "RGB",
secondary: "mixed",
}
print(palettes[primary])
Output:
RGB
Buat frozenset dari iterable apa pun -- frozenset() untuk kasus kosong, frozenset(some_set) untuk mengambil snapshot immutable dari set yang ada:
snapshot = frozenset(s) # immutable copy of s
s.add("new") # snapshot does not change
Dua alasan umum untuk menggunakannya:
Gunakan sebagai kunci dict atau anggota set. Di mana satu nilai tidak dapat menangkap apa yang Anda butuhkan, sebuah
frozensetdari nilai-nilai bisa -- "set fitur yang didukung oleh driver ini", "set pin yang digunakan profil ini".Kunci sebuah konstanta. Sebuah
frozensettingkat modul dari nama-nama yang diizinkan tidak dapat secara tidak sengaja dimutasi oleh pemanggil; sebuahsetbiasa bisa. Lebih baik gunakanfrozensetuntuk apa pun yang dimaksudkan sebagai read-only setelah konstruksi.