Data dunia nyata hampir tidak pernah berbentuk datar. Satu siswa punya nama, beberapa nilai mata pelajaran, dan daftar hobi; satu papan permainan terdiri dari baris dan kolom. Struktur data Python bisa dikombinasikan secara bebas — list berisi dictionary, dictionary berisi list, list berisi list — membentuk struktur bersarang (nested) yang mampu memodelkan data serumit apa pun.
List of Dictionaries #
Pola paling umum dalam pemrosesan data: setiap baris data adalah dictionary, dan seluruh baris dikumpulkan dalam satu list. Setiap elemen list bisa dibaca seperti dictionary biasa.
siswa = [
{"nama": "Budi", "nilai": 90},
{"nama": "Siti", "nilai": 95},
{"nama": "Agus", "nilai": 85},
]
print(siswa[0])
print(siswa[1]["nama"])
for s in siswa:
print(f"{s['nama']}: {s['nilai']}")Output yang Dihasilkan:
{'nama': 'Budi', 'nilai': 90}
Siti
Budi: 90
Siti: 95
Agus: 85Mari kita telaah pola aksesnya:
- Baris
siswa[0]: tanda kurung siku pertama berlaku pada list — mengambil elemen indeks0, yaitu dictionary milik Budi secara utuh. - Baris
siswa[1]["nama"]: dua lapis akses dibaca dari kiri — ambil dictionary indeks1, lalu ambil nilai pada key"nama". - Baris
for s in siswa:: pada setiap putaran, variabelsmenampung satu dictionary;s['nama']dans['nilai']membaca field di dalamnya.
Matriks: List of Lists #
List bersarang satu tingkat lagi membentuk grid dua dimensi: setiap elemen list luar adalah satu baris, dan setiap baris adalah list berisi kolom. Pola ini dipakai di papan permainan, tabel angka, hingga dasar komputasi numerik.
matriks = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
print(matriks[1][2])
print(matriks[0])
total = 0
for baris in matriks:
for angka in baris:
total += angka
print(total)Output yang Dihasilkan:
6
[1, 2, 3]
45Baris matriks[1][2] dibaca bertahap: matriks[1] mengambil list [4, 5, 6], lalu [2] mengambil elemen ketiganya, yaitu 6. Konvensinya [baris][kolom] — indeks pertama memilih baris, indeks kedua memilih kolom di dalam baris tersebut. Loop bersarang for kemudian mengunjungi setiap sel: loop luar mengambil satu baris penuh, loop dalam menulusuri angka di dalam baris, dan variabel total mengakumulasi jumlahnya hingga 45.
Membangun Struktur Secara Bertahap #
Struktur bersarang besar jarang ditulis sekaligus dalam satu literal. Pendekatan yang lebih realistis adalah memulai dari struktur kosong, lalu mengisi data begitu diterima — persis seperti saat membaca input pengguna atau hasil query database.
siswa = []
siswa.append({"nama": "Budi", "nilai": {"matematika": 90, "fisika": 85}})
siswa.append({"nama": "Siti", "nilai": {"matematika": 92, "fisika": 88}})
print(siswa[1]["nilai"]["fisika"])
siswa[0]["nilai"]["kimia"] = 87
print(siswa[0]["nilai"])
print(len(siswa))Output yang Dihasilkan:
88
{'matematika': 90, 'fisika': 85, 'kimia': 87}
2Tiga langkah pembacaan hasil di atas:
siswa[1]["nilai"]["fisika"]: tiga lapis akses — elemen list kedua, lalu dictionarynilai, lalu key"fisika"menghasilkan88.siswa[0]["nilai"]["kimia"] = 87: penugasan bekerja di kedalaman mana pun — menambah mata pelajaran baru hanya untuk dictionary nilai milik siswa pertama, tanpa menyentuh siswa kedua.len(siswa): menghitung elemen tingkat terluar saja, yaitu dua siswa;len(siswa[0]["nilai"])akan menghitung mata pelajaran di dalamnya.
Kombinasi Lain yang Sering Ditemui #
Tiga pola dasar di atas bisa dikombinasikan sesuai kebutuhan. Dictionary berisi list cocok untuk pengelompokan — {"budi": ["matematika", "fisika"]}, dictionary berisi dictionary cocok untuk konfigurasi bertingkat, dan list berisi tuple cocok untuk daftar koordinat tetap. Bentuk list of dictionaries yang kita bahas di awal juga menjadi dasar format pertukaran data JSON yang akan kita pelajari pada Section File Handling.
Satu hal yang perlu diwaspadai: struktur bersarang berarti objek di dalam objek. Ketika kita menyalin struktur bersarang, elemen-elemen di dalamnya mungkin masih dibagi dengan struktur aslinya — topik yang dibedah khusus pada Chapter Shallow Copy dan Deep Copy berikutnya.