Pada chapter Perulangan kita memproses data satu per satu. Pekerjaan analisis yang sesungguhnya jarang sekecil itu: data mentah hampir selalu datang berkelompok — deret nilai transaksi, baris catatan penjualan, daftar harga menu, hingga nama pelanggan yang muncul berulang. Python menyediakan empat struktur data bawaan untuk menampung kelompok-kelompok tersebut, dan kebiasaan memilih struktur yang tepat ikut menentukan apakah kode analisis kita ringkas atau berbelit. Pada chapter ini kita membedah list, tuple, dictionary, dan set memakai data penjualan Toko Kopi Kita, lalu menutup dengan tabel panduan memilih di antara keempatnya.

List untuk Deret Data yang Fleksibel #

List adalah struktur yang paling sering kita pakai sehari-hari: kumpulan nilai berurutan yang isinya bisa berubah kapan saja, dan setiap elemen diakses lewat nomor indeks yang dimulai dari nol. Bagi seorang analis, list adalah wujud alami dari satu deret data — misalnya nilai transaksi tiap pelanggan pada suatu pagi di Toko Kopi Kita (dalam ribuan rupiah).

python
transaksi = [42, 18, 65, 30, 25]

print("Transaksi pertama:", transaksi[0])
print("Transaksi terakhir:", transaksi[-1])
print("Transaksi ke-2 sampai ke-4:", transaksi[1:4])

transaksi.append(55)
print("Setelah transaksi baru masuk:", transaksi)

print("Ada transaksi 65 ribu?", 65 in transaksi)

Output yang Dihasilkan:

text
Transaksi pertama: 42
Transaksi terakhir: 25
Transaksi ke-2 sampai ke-4: [18, 65, 30]
Setelah transaksi baru masuk: [42, 18, 65, 30, 25, 55]
Ada transaksi 65 ribu? True

Mari kita telaah baris-baris kode di atas:

  1. Baris 1 (transaksi = [...]): list literal berisi lima nilai transaksi. Urutan elemen dipertahankan persis seperti saat penulisannya, sehingga urutan ini bisa kita andalkan saat membaca data.
  2. Baris 3-5 (indeks dan slicing): transaksi[0] menunjuk elemen pertama, sedangkan indeks negatif membaca dari belakang sehingga transaksi[-1] mengembalikan 25. Slicing transaksi[1:4] mengambil indeks 1 sampai sebelum 4 — batas atas tidak ikut — pola yang nanti sering kita pakai untuk mengambil jendela data seperti tujuh hari terakhir.
  3. Baris 7 (append): append() menempel satu nilai di ujung list tanpa membuat list baru, cocok untuk data yang terus bertambah sepanjang hari berjalan.
  4. Baris 10 (in): operator in memeriksa keanggotaan dan mengembalikan True atau False — pertanyaan yang sering kita ajukan saat memeriksa apakah suatu nilai anomali pernah muncul.

Tuple untuk Satu Baris Data yang Terkunci #

Catatan penjualan yang sesungguhnya bukan sekadar angka lepas, melainkan baris utuh: tanggal, produk, jumlah cangkir. Makna tiap kolom melekat pada posisinya, dan bentuk baris itu tidak berubah. Struktur semacam itulah tuple: kumpulan berurutan yang isinya terkunci sejak dibuat. Sifat tidak-bisa-diubah (immutable) ini justru berguna bagi analis — baris data yang sudah dicatat tidak akan berubah tanpa sengaja karena kode lain menulis ke posisinya.

python
# Satu baris data penjualan: (tanggal, produk, jumlah cangkir)
baris = ("2026-01-12", "kopi susu", 3)

tanggal, produk, jumlah = baris
print(f"{tanggal}: {jumlah} cangkir {produk}")
print("Jumlah kolom:", len(baris))

try:
    baris[2] = 5
except TypeError as err:
    print("Tuple tidak bisa diubah:", err)

Output yang Dihasilkan:

text
2026-01-12: 3 cangkir kopi susu
Jumlah kolom: 3
Tuple tidak bisa diubah: 'tuple' object does not support item assignment

Mari kita bedah kode di atas:

  1. Baris 2 (baris = (...)): tuple literal ditulis dengan tanda kurung. Skemanya tetap: posisi 0 selalu tanggal, posisi 1 produk, posisi 2 jumlah — kesepakatan ini yang membuat tuple layak menjadi satu record data.
  2. Baris 4 (unpacking): satu tuple langsung diuraikan ke tiga variabel. Cara ini lebih ringkas dan lebih jelas daripada mengambil baris[0], baris[1], baris[2] satu per satu.
  3. Baris 6 (len(baris)): tuple tahu panjangnya sendiri; len() mengembalikannya seperti pada list.
  4. Baris 8-11 (try/except): usaha mengubah posisi ke-2 ditolak Python dengan TypeError. Kita menangkap galat tersebut agar pesannya tercetak rapi, bukan menghentikan program — mekanisme lengkapnya kita bahas pada chapter Penanganan Error .

Gabungkan list dan tuple, dan kita mendapatkan tabel mini: list berisi banyak tuple, misalnya [("2026-01-12", "kopi susu", 3), ("2026-01-13", "matcha", 4)] — setiap elemen adalah satu baris data utuh. Pola pikir “satu baris adalah satu record” inilah yang nanti kita temui lagi ketika bekerja dengan tabel di pandas.

Dictionary untuk Pemetaan Produk ke Harga #

Membaca harga lewat nomor posisi itu rapuh: siapa yang hafal bahwa produk indeks ke-2 adalah matcha? Dictionary menjawab kebutuhan tersebut — mencari nilai lewat nama, bukan nomor. Setiap entri memasangkan kunci dengan nilai, dan daftar harga menu adalah contoh paling alami.

python
harga = {"kopi susu": 24, "americano": 22, "matcha": 28, "teh tawar": 20}

print("Harga matcha:", harga["matcha"])
print("Harga kopi tubruk:", harga.get("kopi tubruk", "belum terdaftar"))

for produk, nilai in harga.items():
    print(f"{produk:12} Rp{nilai}.000")

print("Total harga menu:", sum(harga.values()))

Output yang Dihasilkan:

text
Harga matcha: 28
Harga kopi tubruk: belum terdaftar
kopi susu    Rp24.000
americano    Rp22.000
matcha       Rp28.000
teh tawar    Rp20.000
Total harga menu: 94

Beberapa hal penting dari contoh di atas:

  1. Baris 1: kunci harus unik — satu produk hanya boleh punya satu entri harga. Sejak Python 3.7, urutan entri mengikuti urutan penulisan, sehingga laporan yang kita cetak dari dictionary konsisten.
  2. Baris 3 vs baris 4: akses langsung harga["kopi tubruk"] akan mengangkat KeyError karena kunci itu belum ada. Metode .get(kunci, nilai_default) lebih aman saat data bisa belum lengkap — ia mengembalikan nilai default alih-alih menghentikan program.
  3. Baris 6-7 (.items()): iterasi .items() menghasilkan pasangan kunci dan nilai sekaligus, bentuk standar untuk mencetak laporan dari sebuah dictionary.
  4. Baris 9 (.values()): sum(harga.values()) menjumlahkan seluruh nilai tanpa perlu membongkar pasangannya satu per satu.

Set untuk Menyaring Keunikan #

Kasus khas berikutnya: menghitung pelanggan unik dari catatan kunjungan yang memuat nama berulang — Budi datang tiga kali, Siti dua kali. Set menyimpan nilai tanpa duplikat, sehingga duplikasi hilang begitu daftar dimasukkan ke dalamnya. Pemeriksaan keanggotaan pada set juga cepat, bahkan ketika isinya banyak.

python
pelanggan_hari_ini = ["Budi", "Siti", "Dewi", "Budi", "Rani", "Siti", "Agus", "Budi"]

unik = set(pelanggan_hari_ini)
print("Jumlah kunjungan tercatat:", len(pelanggan_hari_ini))
print("Pelanggan unik (urut):", sorted(unik))
print("Siti masuk daftar unik?", "Siti" in unik)

Output yang Dihasilkan:

text
Jumlah kunjungan tercatat: 8
Pelanggan unik (urut): ['Agus', 'Budi', 'Dewi', 'Rani', 'Siti']
Siti masuk daftar unik? True

Delapan kunjungan ternyata berasal dari lima orang saja — informasi yang penting untuk mengukur loyalitas pelanggan. Ada satu kebiasaan yang perlu kita tanamkan sejak awal: set tidak menjamin urutan. Memanggil print(unik) bisa menghasilkan urutan yang berbeda-beda, dan itu bukan kesalahan melainkan sifatnya. Karena itu setiap kali hasil set ingin ditampilkan atau disimpan, bungkus dengan sorted() seperti pada contoh — keluarannya menjadi terurut dan konsisten antar eksekusi.

Memilih Struktur Data yang Tepat #

Keempat struktur di atas bukan pesaing, melainkan pembagian peran. Tabel berikut merangkum pertanyaan pemandu yang paling cepat menuntun kita ke struktur yang tepat:

StrukturSifat kunciPertanyaan pemanduContoh di toko kopi
listBerurutan, isinya bisa berubahApakah urutan penting dan datanya terus bertambah?Deret transaksi harian
tupleBerurutan, isinya terkunciApakah tiap posisi punya makna tetap seperti kolom?Baris (tanggal, produk, jumlah)
dictMemetakan kunci ke nilaiApakah nilai lebih sering dicari lewat nama?Harga per produk
setAnggota unik, tanpa urutanApakah yang penting hanya keunikan dan keanggotaan?Nama pelanggan unik

Struktur-struktur ini juga saling melengkapi: list berisi tuple membentuk tabel kecil, dictionary yang nilainya list bisa menampung banyak transaksi per pelanggan, dan set menjadi alat pemeriksa cepat seperti “apakah produk ini sudah pernah dijual?”. Ketika kita mulai memakai pandas nanti, keempat konsep ini kembali muncul dalam wujud yang lebih besar: kolom tabel adalah deret seperti list, tiap baris adalah record seperti tuple, dan akses kolom lewat nama seperti dictionary.

Referensi Resmi #

Rangkuman #

  • list menampung deret data berurutan yang isinya bisa bertambah dan berubah; akses lewat indeks, slicing, dan in.
  • tuple cocok untuk satu baris data yang maknanya melekat pada posisi; sifat terkuncinya menjaga record dari perubahan tak disengaja.
  • dict memetakan kunci ke nilai; gunakan .get() dengan nilai default saat kunci mungkin belum ada, dan .items() untuk iterasi laporan.
  • set membuang duplikat dan menjawab pertanyaan keanggotaan dengan cepat, tetapi tidak menjamin urutan — selalu tampilkan lewat sorted().
  • Pilih struktur berdasarkan pertanyaan pemandu pada tabel, bukan kebiasaan; struktur yang tepat meringkas kode analisis.

Data kini punya wadah yang tepat, tetapi logika pengolahannya masih kita tulis ulang-ulang di banyak tempat. Chapter berikutnya, Fungsi dan Modul , membahas cara membungkus perhitungan menjadi fungsi bernama yang bisa dipakai ulang, memakai modul siap pakai dari pustaka standar, lalu merapikannya menjadi modul buatan sendiri.