Dict, Set, dan Tuple

Wadah harian berbasis hash seperti Dict dan Set beserta tuple yang terurut dan tidak dapat diubah.

Daftar isi

Dict, Set, dan tuple melengkapi array untuk kebutuhan penyimpanan sehari-hari. Dict memetakan kunci ke nilai, Set mengumpulkan nilai unik, dan tuple mengelompokkan beberapa nilai yang tidak dapat diubah. Topik ini membahas pembuatan, pembacaan, dan pembaruan ketiganya beserta operasi himpunan pada Set. Setelah topik ini dipraktikkan, wadah yang tepat untuk setiap bentuk data dapat dipilih dan error akibat kunci yang belum terdaftar dapat ditangani dengan tertib.

Dict: pasangan kunci dan nilai#

Dict menyimpan pasangan kunci dan nilai dalam tabel berbasis hash yang menempatkan setiap kunci pada posisi hasil perhitungan fungsi hash. Karenanya, pencarian nilai melalui kunci berlangsung cepat tanpa memeriksa seluruh tabel. Pasangan ditulis dengan operator =>, dan tipe wadahnya ditulis Dict{K, V} dengan K tipe kunci dan V tipe nilainya. Fungsi get menerima nilai default apabila kunci tidak ada, sedangkan haskey sekadar menguji keberadaan kunci.

julia Contoh: membaca Dict dengan indeks, get, dan haskey
stok = Dict("pensil" => 24, "buku" => 10, "penghapus" => 7)
println(stok["buku"])
println(get(stok, "spidol", 0))
println(haskey(stok, "pensil"))
for nama in sort(collect(keys(stok)))
    println(nama, " => ", stok[nama])
end
text Keluaran
10
0
true
buku => 10
penghapus => 7
pensil => 24

Urutan pasangan pada Dict tidak dijamin mengikuti urutan penyisipannya, karena posisi tiap kunci ditentukan oleh fungsi hash. Contoh di atas mengurutkan kuncinya terlebih dahulu agar keluarannya tetap dapat dibaca dan dapat direproduksi. Pembaruan menggunakan penugasan indeks untuk menambah maupun mengganti nilai, sedangkan delete! menghapus pasangan.

julia Contoh: menambah, mengubah, dan menghapus pasangan
stok = Dict("pensil" => 24, "buku" => 10)
stok["spidol"] = 5
stok["buku"] = 12
delete!(stok, "pensil")
for nama in sort(collect(keys(stok)))
    println(nama, " => ", stok[nama])
end
text Keluaran
buku => 12
spidol => 5

Nilai pada Dict tidak terbatas pada bilangan, dan kuncinya dapat berupa tipe apa pun yang dapat dihitung hash-nya, misalnya String, Symbol, atau bilangan bulat. Penugasan pada kunci yang sudah ada mengganti nilainya secara langsung, sedangkan penugasan pada kunci baru menambah pasangan, sehingga satu operasi penugasan mencakup keduanya. Fungsi length menghitung banyaknya pasangan yang tersimpan.

Set: kumpulan nilai unik#

Set menyimpan kumpulan nilai tanpa duplikat dan tanpa urutan, juga berbasis hash. Nilai baru ditambahkan dengan push!, dan keanggotaan diuji dengan operator in. Operasi himpunan union, intersect, dan setdiff menghasilkan gabungan, irisan, serta selisih dua kumpulan. Sama seperti Dict, keluaran Set perlu diurutkan terlebih dahulu apabila urutan tampilnya penting.

julia Contoh: operasi himpunan pada Set
a = Set([1, 2, 3, 4])
b = Set([3, 4, 5])
push!(a, 5)
println(3 in a)
println(sort(collect(a)))
println(sort(collect(union(a, b))))
println(sort(collect(intersect(a, b))))
println(sort(collect(setdiff(a, b))))
text Keluaran
true
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[3, 4, 5]
[1, 2]

push!(a, 5) menambahkan nilai 5 ke dalam a, sedangkan penambahan nilai yang sudah terdaftar tidak mengubah isi Set karena duplikat otomatis ditolak tanpa perlu pemeriksaan manual. Operasi setdiff(a, b) menghasilkan elemen yang ada di a tetapi tidak ada di b, yaitu 1 dan 2 pada contoh di atas.

Keunggulan Set dibandingkan array adalah uji keanggotaan yang cepat, karena pencariannya melalui hash dan tidak menelusuri seluruh isi. Karena itu, Set dipilih apabila keanggotaan sering diuji dan duplikat memang tidak diinginkan, sedangkan array dipilih apabila urutan dan pengulangan nilai merupakan bagian dari data.

Tuple dan NamedTuple#

Tuple mengelompokkan beberapa nilai menjadi satu nilai yang terurut dan tidak dapat diubah. Penulisannya dengan tanda kurung seperti (3, 4), dan isinya diakses melalui indeks. Tuple juga dapat diuraikan (destructuring), yaitu setiap elemennya diikat ke nama tersendiri dalam satu penugasan. Sifat tak berubahnya menjadikan tuple cocok untuk mengembalikan beberapa nilai dari satu fungsi.

julia Contoh: destructuring dan sifat tak berubah tuple
titik = (3, 4)
x, y = titik
println(x + y)
println(titik[1])
println(length(titik))
try
    titik[1] = 9
catch e
    println(typeof(e))
end
text Keluaran
7
3
2
MethodError

Pola pengembalian tuple paling sering ditemui pada fungsi yang mengembalikan beberapa nilai sekaligus. Sebuah fungsi yang berisi return n, m sesungguhnya mengembalikan tuple (n, m), dan pemanggilnya dapat menguraikannya langsung dalam satu baris. Tanda kurung pada tuple bahkan boleh ditinggalkan, sehingga x, y = 3, 4 membentuk tuple di kedua sisinya.

NamedTuple memperluas tuple dengan memberi nama pada setiap posisinya, sehingga isinya diakses melalui nama field, bukan indeks. Penulisannya menggunakan bentuk (nama = nilai, ...), dan fungsi keys menampilkan daftar namanya.

julia Contoh: NamedTuple dengan field bernama
buku = (judul = "Catatan Lab", halaman = 180)
println(buku.judul)
println(buku.halaman)
println(keys(buku))
text Keluaran
Catatan Lab
180
(:judul, :halaman)

Contoh utuh jadwal piket#

Berkas berikut merangkum pola pemakaian Dict menjadi program jadwal piket kelompok, mulai dari pembacaan dengan nilai default, pembaruan isi, perulangan atas kunci yang diurutkan, sampai penangkapan KeyError dengan try-catch agar program selesai secara normal.

julia jadwal-piket.jl
# jadwal-piket.jl
# Jadwal piket kelompok: Dict dari hari ke nama petugas piket.

jadwal = Dict(
    "Senin" => "Ali",
    "Selasa" => "Budi",
    "Rabu" => "Citra",
    "Kamis" => "Dewi",
)

println("Jumlah hari piket: ", length(jadwal))
println("Petugas Rabu: ", get(jadwal, "Rabu", "belum diatur"))
println("Petugas Jumat: ", get(jadwal, "Jumat", "belum diatur"))
println("haskey Jumat: ", haskey(jadwal, "Jumat"))

jadwal["Jumat"] = "Eko"
delete!(jadwal, "Senin")

println("Jadwal setelah perubahan:")
for hari in sort(collect(keys(jadwal)))
    println("  ", hari, " => ", jadwal[hari])
end

try
    println(jadwal["Sabtu"])
catch e
    println("Terjadi ", typeof(e), " untuk kunci Sabtu")
end
text Keluaran
Jumlah hari piket: 4
Petugas Rabu: Citra
Petugas Jumat: belum diatur
haskey Jumat: false
Jadwal setelah perubahan:
  Jumat => Eko
  Kamis => Dewi
  Rabu => Citra
  Selasa => Budi
Terjadi KeyError untuk kunci Sabtu

Program tersebut memperlihatkan tiga kebiasaan yang berulang dalam pemakaian Dict. Pembacaan hari yang mungkin belum terdaftar selalu melalui get dengan nilai default, penyajian isi selalu mengurutkan kuncinya lebih dahulu, dan akses langsung yang berisiko menimbulkan KeyError dibungkus try-catch sehingga program berakhir dengan status normal. Dengan tiga kebiasaan itu, Dict yang isinya berubah dinamis tetap mudah dipelihara.

Kesalahan umum#

Kesalahan berikut paling sering muncul saat Dict dan tuple dipraktikkan. Yang pertama dapat direproduksi dan ditangkap pada contoh berikut.

julia Contoh: mengakses kunci yang belum ada
stok = Dict("buku" => 10)
try
    println(stok["pensil"])
catch e
    println(typeof(e))
end
text Keluaran
KeyError
  • Mengakses kunci dengan indeks tanpa memastikan keberadaannya. Akses ke kunci yang belum terdaftar berhenti dengan KeyError, sedangkan get dengan nilai default atau haskey mencegahnya sejak awal. Bentuk get! bahkan menyimpan nilai defaultnya ke dalam Dict apabila kunci tersebut belum ada.
  • Mengandalkan urutan pasangan pada Dict dan Set. Urutannya ditentukan oleh fungsi hash dan dapat berubah saat isi berubah, sehingga keluaran yang diurutkan dengan sort menjadi cara penyajian yang andal.
  • Mencoba mengubah isi tuple. Tuple tidak menyediakan penugasan indeks, dan usahanya berhenti dengan MethodError. Gunakan array apabila isinya memang perlu diperbarui, atau bentuk tuple baru apabila nilainya berubah.

Ringkasan#

  • Dict memetakan kunci ke nilai berbasis hash, dibaca dengan indeks, get dengan default, atau haskey, dan diperbarui dengan penugasan indeks serta delete!.
  • Urutan pasangan Dict dan Set tidak dijamin, sehingga penyajian yang dapat direproduksi memerlukan pengurutan kunci terlebih dahulu.
  • Set menyimpan nilai unik dan menyediakan operasi himpunan union, intersect, dan setdiff beserta uji keanggotaan in.
  • Tuple bersifat terurut dan tidak dapat diubah, dapat diuraikan ke beberapa nama, sedangkan NamedTuple menambahkan nama field pada tiap posisinya.

Referensi#