Tuple dan Set di Python
Kenalan dengan tuple yang anti-diubah (plus trik unpacking) dan set yang otomatis membuang duplikat serta jago operasi himpunan.
Analogi: paket tersegel dan kantong kelereng
Bayangkan dua wadah. Wadah pertama adalah paket kiriman yang sudah disegel lakban: isinya tetap, tidak bisa ditambah atau diganti. Kalau mau isinya beda, kamu harus bikin paket baru. Itulah tuple.
Wadah kedua adalah kantong kelereng: setiap kelereng di dalamnya pasti unik, tidak ada kembaran. Kalau kamu memasukkan kelereng yang sama, ia otomatis ditolak. Itulah set.
Keduanya melengkapi list: tuple untuk data yang tidak boleh berubah, set untuk data yang harus unik.
Kenapa konsep ini ada?
List itu fleksibel, tapi fleksibilitas ada harganya. Kadang kamu butuh jaminan bahwa data tidak berubah di tengah jalan, misalnya koordinat atau konfigurasi yang kalau diubah diam-diam bisa merusak program. Tuple memberi jaminan itu.
Di sisi lain, data nyata penuh duplikat: daftar email pelanggan yang dobel, kategori produk yang berulang. Mengecek duplikat satu per satu dengan list itu lambat. Set menyimpan data dengan cara yang membuat pengecekan "apakah X sudah ada?" super cepat, plus operasi himpunan bawaan seperti irisan dan gabungan.
Tuple: tidak bisa diubah, tapi bisa dibongkar
# tuple dibuat dengan kurung biasa
koordinat = (10, 20)
print(koordinat[0]) # 10
# mencoba mengubah -> error!
# koordinat[0] = 99 # TypeError
# unpacking: bongkar isi tuple ke variabel
x, y = koordinat
print(x, y) # 10 20
# tukar dua variabel tanpa variabel bantu
a, b = 5, 9
a, b = b, a
print(a, b) # 9 5Kapan pakai tuple, bukan list? Kalau datanya tetap secara makna: koordinat, tanggal (tahun, bulan, hari), konfigurasi, atau key yang butuh struktur tetap.
Set: unik otomatis dan operasi himpunan
# duplikat otomatis hilang
angka = {1, 2, 2, 3, 3, 3}
print(angka) # {1, 2, 3}
# tambah dan hapus
angka.add(4)
angka.discard(2)
print(angka) # {1, 3, 4}
# operasi himpunan
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b) # gabungan: {1, 2, 3, 4, 5, 6}
print(a & b) # irisan: {3, 4}
print(a - b) # selisih (di a tapi tidak di b): {1, 2}Catatan teknis: Set tidak punya urutan dan tidak bisa diindeks (
angka[0]error). Kalau butuh urutan, ubah dulu jadi list yang diurutkan:sorted(angka).
Contoh 1: membersihkan email duplikat
# data mentah dari dua sumber, banyak yang dobel
sumber_a = ["[email protected]", "[email protected]", "[email protected]"]
sumber_b = ["[email protected]", "[email protected]", "[email protected]"]
# gabungkan lalu unikkan dalam dua baris
semua = set(sumber_a) | set(sumber_b)
print(sorted(semua))
# ['[email protected]', '[email protected]', '[email protected]', '[email protected]']
# siapa yang ada di kedua sumber? (irisan)
kembar = set(sumber_a) & set(sumber_b)
print(kembar) # {'[email protected]'}Contoh 2: tuple untuk data berpasangan yang tetap
# tiap transaksi: (id, nominal) -> tidak boleh berubah setelah dicatat
transaksi = [
("TRX001", 15000),
("TRX002", 8000),
("TRX003", 12000),
]
total = 0
for kode, nominal in transaksi: # unpacking langsung di loop
print(kode, "sebesar Rp", nominal)
total += nominal
print("Total pemasukan: Rp", total)Kesalahan umum pemula
SALAH: tuple satu elemen tanpa koma
satu = (5)
print(type(satu)) # <class 'int'> BUKAN tuple!BENAR: tambah koma di belakangnya
satu = (5,)
print(type(satu)) # <class 'tuple'>SALAH: mencoba mengubah isi tuple
hari = ("Senin", "Selasa")
hari[0] = "Ahad" # TypeError: 'tuple' object does not support item assignmentBENAR: buat tuple baru kalau butuh versi berbeda
hari = ("Senin", "Selasa")
hari = ("Ahad",) + hari[1:]
print(hari) # ('Ahad', 'Selasa')SALAH: mengindeks set seperti list
unik = {1, 2, 3}
print(unik[0]) # TypeError: 'set' object is not subscriptableBENAR: iterasi langsung, atau ubah ke list bila butuh indeks
unik = {1, 2, 3}
for u in unik:
print(u)
print(sorted(unik)[0]) # 1Tantangan
Kategori Unik Produk
Diberi list tuple (nama_produk, kategori) dengan beberapa kategori dobel. Pakai set untuk mencetak daftar kategori unik yang terurut, lalu hitung ada berapa kategori.